java之ssm框架搭建中遇到的问题
--------------------------2018-4-25更新------------------------------
spring 4.0.2.RELEASE版本可能不能被jdk8u161版本识别,导致使用不了注解,最好用4.3.1.RELEASE以上的版本(4.3以下没试过不知道,用的时候是4.3.1和4.3.9都可以)
在使用tomcat启动时候可能会发生LOC异常(基本上是jar包错误)详情请看:https://www.cnblogs.com/miye/p/7211602.html
由于spring版本用的是4.3以上可能会发生:Spring集成JSON报错:java.lang.ClassNotFoundException: org.codehaus.jackson.JsonProcessingException
详情请看:https://blog.csdn.net/jiaotuwoaini/article/details/52366057
由于换成了spring4.3.9.RELEASE,tomcat启动报异常org.springframework.beans.NotWritablePropertyException: Invalid property 'ignoreAcceptHeader' of bean class [org.springframework.web.servlet.view.ContentNegotiatingViewResolver]: Bean property 'ignoreAcceptHeader' is not writable or has an invalid setter
由错误可知在org.springframework.web.servlet.view.ContentNegotiatingViewResolver试图解析器中ignoreAcceptHeader属性没有getset方法。所以视图解析图须作如下修改
新增一个关于org.springframework.web.accept.ContentNegotiationManagerFactoryBean的bean,id取为cnManager(随意),具体配置如下:
<bean id="cnManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="ignoreAcceptHeader" value="true"/> <property name="favorPathExtension" value="true"/> <property name="defaultContentType" value="text/html"/> <property name="favorParameter" value="false" /> <property name="mediaTypes"> <map> <entry key="json" value="application/json" /> <entry key="xls" value="application/vnd.ms-excel" /> <entry key="xlsx" value="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/> <entry key="pdf" value="application/pdf" /> </map> </property> </bean>
然后试图解析器将原来的property替换掉,
原来是这样
代码如下:
<bean id="cnManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean"> <property name="ignoreAcceptHeader" value="true"/> <property name="favorPathExtension" value="true"/> <property name="defaultContentType" value="text/html"/> <property name="favorParameter" value="false" /> <property name="mediaTypes"> <map> <entry key="json" value="application/json" /> <entry key="xls" value="application/vnd.ms-excel" /> <entry key="xlsx" value="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/> <entry key="pdf" value="application/pdf" /> </map> </property> </bean>
修改后是这样,只有2个property了。
<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> <property name="contentNegotiationManager" ref="cnManager"/> <property name="viewResolvers"> <list> <!-- 配置freeMarker视图解析器 --> <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="cache" value="true" /> <property name="prefix" value="" /><!-- 上面已经配了,这里就不用配啦 --> <property name="suffix" value=".ftl" /> <property name="contentType" value="text/html;charset=UTF-8" /> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" /> <property name="allowSessionOverride" value="true" /> <property name="allowRequestOverride" value="true" /> <property name="exposeSpringMacroHelpers" value="false" /> <property name="exposeRequestAttributes" value="true" /> <property name="exposeSessionAttributes" value="true" /> <property name="requestContextAttribute" value="request" /> </bean> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <property name="suffix" value=".jsp" /> </bean> </list> </property> </bean>
原因是ContentNegotiatingViewResolver里面的ignoreAcceptHeader属性调整到了org.springframework.web.accept.ContentNegotiationManagerFactoryBean里面包括get、set方法。