首先,我是Spring的新手,这是我第一次尝试使用Spring编写基于REST的应用程序。
我打算在请求参数和响应中使用Json。这让我有两个问题。
有没有办法全局设置produces="application/json"
作为我所有mvc控制器响应的默认值。
如果有人发送请求并希望得到的格式不是application/json
,我希望返回错误消息。我想这是一个拦截器的责任,但了解如何设置支票。
答案 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>