Java 使用列表作为扩展的Spring请求

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">

我使用的是Spring3.2.3。如您所见,它不推荐我们以前用于配置json处理的MediaType,引入了ContentNegotiationManager。听起来很棒。但这让我很恼火

我有如下xml配置:

<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>