春季拦截

时间:2012-07-29 09:51:43

标签: java spring rest spring-mvc

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

我打算在请求参数和响应中使用Json。这让我有两个问题。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

对请求也是如此 - Spring MVC将尽力将请求体转换为request对象。配置完成后(例如,您需要在CLASSPATH上jackson*.jar来处理JSON),它才能正常工作。

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

另见

答案 1 :(得分:0)

虽然没有办法在全球范围内设置produces,而且正如Tomasz建议通常更容易将内容协商留给春天,它也很容易实现功能作为一个拦截器。

基本上,您需要在没有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>