【问题标题】:Spring ignores my ContentNegotiatingViewResolverSpring 忽略了我的 ContentNegotiatingViewResolver
【发布时间】:2013-11-11 15:57:31
【问题描述】:

我正在构建一个简单的 REST 服务,它应该返回编码为 JSON 或 JSONP 的数据(取决于客户端请求的内容)。我关注了the tutorial on vivin.net。

WEB-INF/config/config.xml:

<beans ...>
  ...
  <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="favorPathExtension" value="true"/>
    <property name="mediaTypes">
      <map>
        <entry key="json" value="application/json" />
        <entry key="jsonp" value="application/javascript" />
      </map>
    </property>
    <property name="defaultViews">
      <list>
        <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        <bean class="cz.dusanrychnovsky.utils.json.MappingJacksonJsonpView" />
      </list>
    </property>
  </bean>
</beans>

MappingJacksonJsonpView.java

public class MappingJacksonJsonpView extends MappingJacksonJsonView
{
    public static final String DEFAULT_CONTENT_TYPE = "application/javascript";

    @Override
    public String getContentType() {
        return DEFAULT_CONTENT_TYPE;
    }

    @Override
    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) 
        throws Exception 
    {
        ...
    }
}

不过,当我尝试请求 http://localhost:8080/service/resource.jsonp 时,Spring 仍会使用 MappingJacksonJsonView(如日志所示)并返回编码为 JSON(而不是 JSONP)的输出。

我做错了什么?

如果我遗漏了一些重要的细节,请向他们索取。我会立即更新帖子。

【问题讨论】:

标签: java json spring rest spring-mvc


【解决方案1】:

我认为你最好遵循 spring.io 提供的教程:

http://spring.io/guides/gs/rest-service/

如果您使用的是最新版本的 Spring,它会自动执行 Jackson 编组。所以你不应该有上面的任何代码。

【讨论】:

  • 问题是我需要将响应编组为JSONP,而不是JSON,才能绕过the same origin policy。
  • 在这种情况下,请使用此处提供的答案:stackoverflow.com/questions/15282617/…
  • 谢谢。尽管该解决方案 (IMO) 打破了 MVC 抽象规则(表示问题在控制器内部处理),但它似乎是目前基于 Spring 的 REST 服务可用的最佳解决方案。
  • 其实有点令人费解。 Spring-data-rest 确实提供了内置的 JSONP 配置 (github.com/spring-projects/spring-data-rest/wiki/…),但 Spring MVC 似乎还没有开箱即用地支持它。也许很快?
猜你喜欢
  • 2018-09-08
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 2014-04-06
  • 2016-02-23
  • 2011-12-22
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多