【问题标题】:Spring interception弹簧拦截
【发布时间】:2012-07-27 08:10:56
【问题描述】:

首先,我是 Spring 新手,这是我第一次尝试使用 Spring 编写基于 REST 的应用程序。

我计划在请求参数和响应中都使用 Json。这让我想到了两个问题。

  1. 有没有办法将 produces="application/json" 全局设置为我所有 mvc 控制器响应的默认值。

  2. 如果有人发送请求并期望得到不是application/json 格式的结果,我想返回一条错误消息。我想这是拦截器的责任,但了解如何设置检查。

【问题讨论】:

    标签: java spring rest spring-mvc


    【解决方案1】:

    实际上更简单。您只需从控制器返回 Java 对象,Spring 将根据 Accept 标头确定要使用的格式:

    @ResponseBody
    public MyPojo noView(@RequestBody request) {
      return new MyPojo();
    }
    

    对请求也是如此——Spring MVC 将尽最大努力将请求体转换为request 对象。一旦配置好(例如,您需要在 CLASSPATH 上使用 jackson*.jar 来处理 JSON),它就可以工作了。

    此外,由于您免费获得 XML,因此将端点限制为 JSON 是没有意义的。如果用户请求其他格式,Spring 将为您发送适当的错误消息(错误请求?)

    另见

    【讨论】:

      【解决方案2】:

      虽然没有办法在全局范围内设置produces,而且正如 Tomasz 建议的那样,将内容协商留给 spring 通常更容易,但将功能实现为拦截器也很容易。

      基本上,您需要在任何没有 Accept 标头和 application/json 作为值的请求上返回 415 状态代码。

      所以先实现拦截器:

      public class WrongAcceptHeaderInterceptor extends HandlerInterceptorAdapter {
      
          public boolean preHandle(
                  HttpServletRequest request,
                  HttpServletResponse response,
                  Object handler) throws Exception {
              if (!"application/json".equals(request.getHeader("Accept"))) {
                  //you can change or omit the message 
                  response.sendError(SC_UNSUPPORTED_MEDIA_TYPE, "Your error message"); 
                  // return false to skip further processing
                  return false;
              }
          }
      }
      

      然后在你的上下文中注册它:

      <mvc:interceptors>
          <bean class="foo.bar.baz.WrongAcceptHeaderInterceptor" />
      </mvc:interceptors>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2020-10-01
        • 2011-06-28
        • 2020-03-26
        • 2017-12-22
        相关资源
        最近更新 更多