Java 使用列表作为扩展的Spring请求
我使用的是Spring3.2.3。如您所见,它不推荐我们以前用于配置json处理的MediaType,引入了ContentNegotiationManager。听起来很棒。但这让我很恼火 我有如下xml配置:Java 使用列表作为扩展的Spring请求,java,json,spring,spring-mvc,Java,Json,Spring,Spring Mvc,我使用的是Spring3.2.3。如您所见,它不推荐我们以前用于配置json处理的MediaType,引入了ContentNegotiationManager。听起来很棒。但这让我很恼火 我有如下xml配置: <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="contentNegotiationManager">
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="contentNegotiationManager">
<bean class="org.springframework.web.accept.ContentNegotiationManager">
<constructor-arg>
<bean class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
<constructor-arg>
<map>
<entry key="json" value="application/json" />
<entry key="list" value="application/json" />
</map>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</property>
<property name="defaultViews">
<list>
<bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
</list>
</property>
</bean>
这个方法只接受json请求,除了带有列表扩展的URL之外,一切都很好。经过长时间的跟踪,我发现无论我在xml中配置了什么,就像我上面提到的一样,都会有一个org.springframework.web.accept.ServletPathExtensionContentNegotiationStrategy和org.springframework.web.accept.HeaderContentNegotiationStrategy,我不知道它来自哪里,因为我没有别的地方可以设置这些东西。调试信息如下图所示
调试信息是从ContentNegotiationManager类捕获的
我不知道是否有人遇到这个问题,任何帮助都将不胜感激。谢谢
<entry key="list" value="application/json" />
这是无效的。从javadocs:
使用URL路径扩展名的ContentNegotiationStrategy
确定请求的介质类型。路径扩展
首先在提供给的媒体类型映射中查找
构造器。如果失败,Java激活框架将用作
后备机制
.list不是有效的媒体类型。这只是一个URL模式
将@RequestMappingvalue=/product.list更改为@RequestMappingvalue=/product
检查类路径中是否有有效的Jackson库。最后,我找到了一个解决方案 通过在使用mvc:annotation-driven时指定内容协商管理器,然后将favorPathExtension设置为false。问题会解决的
<mvc:annotation-driven content-negotiation-manager="negotiationManager"></mvc:annotation-driven>
<bean id="negotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
<property name="ignoreAcceptHeader" value="true" />
<property name="defaultContentType" value="application/json" />
<property name="useJaf" value="false" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="html" value="text/html" />
</map>
</property>
</bean>
无论如何,谢谢。嗨,Bhaskara,我的类路径中有Jackson库,所有有另一个扩展的东西都工作得很好,比如product.update、product.add等等。但是列表扩展被映射到text/plain,这是主要问题。我不知道为什么。
<mvc:annotation-driven content-negotiation-manager="negotiationManager"></mvc:annotation-driven>
<bean id="negotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="favorPathExtension" value="false" />
<property name="ignoreAcceptHeader" value="true" />
<property name="defaultContentType" value="application/json" />
<property name="useJaf" value="false" />
<property name="mediaTypes">
<map>
<entry key="json" value="application/json" />
<entry key="html" value="text/html" />
</map>
</property>
</bean>