【问题标题】:ContentNegotiatingViewResolver MediaTypes Error after Upgrading to Spring 4.2升级到 Spring 4.2 后的 ContentNegotiatingViewResolver MediaTypes 错误
【发布时间】:2017-02-08 23:45:33
【问题描述】:

我有一个具有 Bean 的 dispatcher-servlet.xml 文件,如下所示:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver" p:defaultContentType="text/html">
    <property name="mediaTypes">
        <map>
            <entry key="html" value="text/html"/>
            <entry key="json" value="application/json"/>
        </map>
    </property>
    <property name="viewResolvers">
        <list>
            <bean id="localBasedViewResolver" class="com.company.web.i18n.LocaleBasedViewResolver"
                  p:viewClass="org.springframework.web.servlet.view.JstlView"
                  p:prefix="${views.prefix}"
                  p:suffix="${views.suffix}"
                  p:cacheUnresolved="false"
                  p:exposedContextBeanNames="webProperties"
                  p:order="1"
                  />
            <bean id="viewResolver"
                  class="org.springframework.web.servlet.view.InternalResourceViewResolver"
                  p:viewClass="org.springframework.web.servlet.view.JstlView"
                  p:prefix="${views.prefix}"
                  p:suffix="${views.suffix}"
                  p:cacheUnresolved="false"
                  p:exposedContextBeanNames="webProperties"
                  p:order="2"
                  />
        </list>
    </property>
    <property name="defaultViews">
        <list>
            <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
        </list>
    </property>
</bean>

升级到 Spring 4.2 后出现以下错误:

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'mediaTypes' of bean class [org.springframework.web.servlet.view.ContentNegotiatingViewResolver]: Bean property 'mediaTypes' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.BeanWrapperImpl.createNotWritablePropertyException(BeanWrapperImpl.java:230) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:423) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.AbstractNestablePropertyAccessor.setPropertyValue(AbstractNestablePropertyAccessor.java:280) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]

这在升级之前有效,因此非常感谢任何有关如何修复的帮助!

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    Spring 4.2 ContentNegotiatingViewResolver 现在将内容协商委托给 ContentNegotiationManager。在您的应用程序上下文中定义一个 ContentNegotiationManager bean 并将其设置在您的视图解析器上,如下所示

     <bean id="contentNegotiationManager"  class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
            <property name="favorPathExtension" value="true" />
            <property name="ignoreAcceptHeader" value="true"/>
            <property name="useJaf" value="false"/>
            <property name="defaultContentType" value="text/html" />
    
            <property name="mediaTypes">
                <map>
                   <entry key="html" value="text/html"/>
                    <entry key="json" value="application/json"/>
               </map>
            </property>
        </bean>
    

    然后按如下方式更新您的视图解析器

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="contentNegotiationManager" ref="contentNegotiationManager"/>
        <property name="viewResolvers">
            <list>
                <bean id="localBasedViewResolver" class="com.company.web.i18n.LocaleBasedViewResolver"
                      p:viewClass="org.springframework.web.servlet.view.JstlView"
                      p:prefix="${views.prefix}"
                      p:suffix="${views.suffix}"
                      p:cacheUnresolved="false"
                      p:exposedContextBeanNames="webProperties"
                      p:order="1"
                      />
                <bean id="viewResolver"
                      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
                      p:viewClass="org.springframework.web.servlet.view.JstlView"
                      p:prefix="${views.prefix}"
                      p:suffix="${views.suffix}"
                      p:cacheUnresolved="false"
                      p:exposedContextBeanNames="webProperties"
                      p:order="2"
                      />
            </list>
        </property>
        <property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
            </list>
        </property>
    </bean>
    

    【讨论】:

    • 太棒了!我想我们快到了。它仍在抱怨 p:defaultContentType="text/html"。这是否也出现在 ContentNegotiationManager 中,还是一个单独的问题?如果可能的话,我想在这里解决这个问题,以防万一这也有助于下一个来到这里的人。
    • defaultContentType 应该在 ContentNegotiationManager 中,如上所示 。更改它以满足您的需求
    猜你喜欢
    • 2015-03-01
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2013-11-04
    • 2019-10-31
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多