ERROR:Bean property 'mediaTypes' is not writable or has an invalid setter method. Does theparameter type of the setter match the return type of the getter?后续spring版本中的mediaTypes居然不支持setter方法了
(解决方法亲测有用)
错误描述
一般的为了使用Json,对其配置:
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<propertyname="order"value="1"/>
<propertyname="mediaTypes">
<map>
<entrykey="html"value="text/html"/>
<entrykey="xml"value="application/html"/>
<entrykey="json"value="application/json"/>
</map>
</property>
<propertyname="defaultViews">
<list>
<bean
class="org.springframework.web.servlet.view.json.MappingJackson2JsonView">
</bean>
</list>
</property>
<propertyname="ignoreAcceptHeader"value="true"/>
</bean>
结果是会出现上述错误提示:Bean property'mediaTypes' is not writable or has an invalid setter method. Does theparameter type of the setter match the return type of the getter?
意思是ContentNegotiatingViewResolver中不再支持mediaTypes的setter方法了。究其原因,是因为ContentNegotiatingViewResolver的setMediaTypes(Map<String,String>mediaTypes)方法已经被弃用(deprecated),不仅如此,一同被deprecated的的还有setFavorPathEctension 、setFavorParameter、setIgnoreAcceptHeader等方法,但是,这些方法都转移到了ContentNegotiationManager中了,为此,要想对其使用,可以转换为对ContentNegotiationManager的配置。
另外,对于数据形式的多种形式表述(html/xml/json/pdf/excel),Spring有两种表述形式:
・ org.springframework.web.servlet.view.ContentNegotiatingViewResolver
・ org.springframework.http.converter.HttpMessageConverte
ContentNegotiatingViewResolver虽然是ViewResolver一族的,但是并不解析视图,而是将其委托给其他的ViewResolver。
介于spring的两种表述方法,但是ContentNegotiatingViewResolver弃用了setMediaTypes,所以用contentNegotiationManager替换,但是配置contentNegotiationManager是通过ContentNegotiationManagerFactoryBean来实现的,所以,选择第一种办法,要对ContentNegotiationManagerFactoryBean进行配置。
所以,在这里,呈现不同格式的数据可以有两种办法:ContentNegotiationManager和HttpMessageConverter
解决方法
首先在pom.xml文件中加入依赖,然后对其选择一种配置方案即可成功,亲测有用。
加入依赖
方法1:配置ContentNegotiationManager
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.4</version>
</dependency>
方法2:配置HttpMessageConverter
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>