Java 弹簧拦截

Java 弹簧拦截,java,spring,rest,spring-mvc,Java,Spring,Rest,Spring Mvc,首先,我是Spring的新手,这是我第一次尝试使用Spring编写基于REST的应用程序 我计划在请求参数和响应中使用Json。这就引出了两个问题 是否有一种方法可以全局设置products=“application/json”作为所有mvc控制器响应的默认值 如果任何人发送请求并希望得到非application/json格式的结果,我将返回一条错误消息。我想这是拦截者的责任,但我知道如何设置检查 实际上更简单。您只需从控制器返回Java对象,Spring将根据Accept标题确定使用哪种格式:

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

我计划在请求参数和响应中使用Json。这就引出了两个问题

  • 是否有一种方法可以全局设置
    products=“application/json”
    作为所有mvc控制器响应的默认值

  • 如果任何人发送请求并希望得到非
    application/json
    格式的结果,我将返回一条错误消息。我想这是拦截者的责任,但我知道如何设置检查


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

    @ResponseBody
    public MyPojo noView(@RequestBody request) {
      return new MyPojo();
    }
    
    请求也是如此——Spring MVC将尽最大努力将请求主体转换为
    request
    对象。一旦配置好它(例如,您需要在类路径上
    jackson*.jar
    来处理JSON),它就可以工作了

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

    另见

    虽然无法在全球范围内设置
    产品
    ,而且正如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>