1

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

我计划在请求参数和响应中都使用 Json。这给我带来了两个问题。

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

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

4

2 回答 2

2

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

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

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

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

也可以看看

于 2012-07-29T11:28:33.550 回答
0

虽然没有办法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>
于 2012-07-29T15:22:40.530 回答