首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧拦截

弹簧拦截
EN

Stack Overflow用户
提问于 2012-07-29 09:51:42
回答 2查看 1.6K关注 0票数 1

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

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

  1. 是否有一种方法在全局上将produces="application/json"设置为所有mvc控制器响应的默认值。
  2. 如果有人发送请求,并期望得到application/json以外的其他格式的结果,我想返回一条错误消息。我想这是我一个拦截器的责任,但我知道如何设置检查.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-29 15:22:40

虽然没有办法在全局上设置produces,而且,正如Tomasz所建议的那样,将内容协商留给spring通常更容易,但作为拦截器实现该功能也相当容易。

基本上,对于没有以Accept作为值的application/json头的任何请求,都需要返回415状态代码。

因此,首先实现拦截器:

代码语言:javascript
复制
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;
        }
    }
}

然后在你的上下文中注册:

代码语言:javascript
复制
<mvc:interceptors>
    <bean class="foo.bar.baz.WrongAcceptHeaderInterceptor" />
</mvc:interceptors>
票数 0
EN

Stack Overflow用户

发布于 2012-07-29 11:28:33

其实更简单。您只需从控制器返回Java对象,Spring就会根据Accept报头确定使用哪种格式:

代码语言:javascript
复制
@ResponseBody
public MyPojo noView(@RequestBody request) {
  return new MyPojo();
}

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

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

另请参阅

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11708284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档