首先,我是 Spring 新手,这是我第一次尝试使用 Spring 编写基于 REST 的应用程序。
我计划在请求参数和响应中都使用 Json。这给我带来了两个问题。
有没有办法
produces="application/json"
为我的所有 mvc 控制器响应全局设置为默认值。如果有人发送请求并期望得到其他格式的结果
application/json
,我想返回一条错误消息。我想这是拦截器的责任,但了解如何设置检查。
首先,我是 Spring 新手,这是我第一次尝试使用 Spring 编写基于 REST 的应用程序。
我计划在请求参数和响应中都使用 Json。这给我带来了两个问题。
有没有办法produces="application/json"
为我的所有 mvc 控制器响应全局设置为默认值。
如果有人发送请求并期望得到其他格式的结果application/json
,我想返回一条错误消息。我想这是拦截器的责任,但了解如何设置检查。
它实际上更简单。您只需从控制器返回 Java 对象,Spring 将根据Accept
标头确定要使用的格式:
@ResponseBody
public MyPojo noView(@RequestBody request) {
return new MyPojo();
}
请求也是如此——Spring MVC 将尽最大努力将请求体转换为request
对象。一旦配置好(例如,您需要jackson*.jar
在 CLASSPATH 上处理 JSON),它就可以工作了。
此外,由于您免费获得 XML,因此将端点限制为 JSON 是没有意义的。如果用户请求其他格式,Spring 将为您发送适当的错误消息(错误请求?)
虽然没有办法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>