Java Spring忽略了我的内容协商解决方案
我正在构建一个简单的REST服务,它应该返回编码为JSON或JSON的数据(取决于客户端的请求)。我跟着 WEB-INF/config/config.xml:Java Spring忽略了我的内容协商解决方案,java,json,spring,rest,spring-mvc,Java,Json,Spring,Rest,Spring Mvc,我正在构建一个简单的REST服务,它应该返回编码为JSON或JSON的数据(取决于客户端的请求)。我跟着 WEB-INF/config/config.xml: <beans ...> ... <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="favorPathExtension" value="true"
<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
{
...
}
}
公共类MappingJacksonJsonpView扩展了MappingJacksonJsonView
{
公共静态最终字符串DEFAULT\u CONTENT\u TYPE=“application/javascript”;
@凌驾
公共字符串getContentType(){
返回默认的内容类型;
}
@凌驾
公共void呈现(映射模型、HttpServletRequest请求、HttpServletResponse响应)
抛出异常
{
...
}
}
当我试图请求http://localhost:8080/service/resource.jsonp
,但是Spring仍然会使用MappingJacksonJsonView(如日志所示),并返回编码为JSON的输出(而不是JSONP)
我做错了什么
如果我遗漏了一些重要的细节,请询问。我会马上更新这篇文章。我认为您最好遵循spring.io上提供的教程:
如果您使用的是最新版本的Spring,它会自动执行Jackson编组。因此,您不应该使用上面的任何代码。本质上,这看起来是重复的问题是,我需要将响应封送到JSON中,而不是JSON中,以便能够绕过。在这种情况下,请使用此处提供的答案:谢谢。尽管这个解决方案(IMO)打破了MVC抽象规则(表示问题在控制器内部处理),但它似乎是目前用于基于Spring的REST服务的最佳解决方案。SpringDataREST确实提供了内置的JSONPConfig(),但SpringMVC似乎还不支持它。也许很快?