2016-05-18 9 views
3

zum Frühling Upgrade habe ich eine Dispatcher-servlet.xml Datei, die ein Bean wie diese hat:ContentNegotiatingViewResolver MediaTypes Fehler nach 4.2

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

Nach dem Upgrade 4.2 ich folgende Fehlermeldung erhalten, zum Frühling:

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] 

Dies funktionierte vor dem Upgrade, so dass jede Hilfe bei der Reparatur sehr geschätzt werden würde!

Antwort

12

Spring 4.2 ContentNegoatingViewResolver delegiert die Inhaltsverhandlung nun an einen ContentNegotiationManager. Definieren Sie eine ContentNegotiationManager Bohne in Ihrem Anwendungskontext und setzen Sie ihn auf Ihrer Ansicht Resolver wie folgt

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

Dann ist Ihre Ansicht Resolver wie folgt aktualisieren

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

Awesome! Ich denke, wir sind fast da. Es klagt immer noch über das p: defaultContentType = "text/html". Geht das auch im Content NegotiationManager oder ist das eine separate Frage? Wenn es möglich ist, möchte ich das hier klären, falls das auch der nächsten Person, die hierher kommt, helfen wird. – DavidR

+0

defaultContentType sollte wie oben angegeben im ContentNegotiationManager enthalten sein . Ändern Sie es nach Ihren Bedürfnissen –

Verwandte Themen