最近做了一个后台系统的用户管理的demo,主要是基于shiro的权限控制。要返回的权限pojo的字段description中有汉字,树出来了,但是显示的全是???
后来去网上查 需要在requestMapping里加些参数,如下
@RequestMapping(value=”/admin/permissionList”,produces = “text/html;charset=UTF-8”)
这里的text/htm是内容类型,当时返回权限数据的内容类型是text/plain,然后我就照做了,在requestMapping里加上produces = “text/plain;charset=UTF-8”,然而页面上却报错了,Cannot read property ‘substring’ of undefined,应该是数据格式的问题。
还有种方法是在springmvc-context配置文件中配置如下
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
ztree仍然报哪个错,其实是我设置错了,我搭建工程时是从之前的工程复制过来的,里面有如下配置
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="com.fasterxml.jackson.databind.ObjectMapper">
<property name="dateFormat">
<bean class="java.text.SimpleDateFormat">
<constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
</bean>
</property>
<property name="serializationInclusion">
<value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
</property>
<property name="propertyNamingStrategy">
<bean class="com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy" />
</property>
</bean>
</property>
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
<value>application/json</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
我把MappingJackson2HttpMessageConverter误认为StringHttpMessageConverter,所以设置好了却还报错,非常困惑。后来发现了这一点后修改为StringHttpMessageConverter就好了。其实后来试了试,不加StringHttpMessageConverter也没事,就是只加如下就行
<mvc:annotation-driven>
这里想到的就是,很多问题或者bug的解决思路,方向非常重要,有时候一直在百度上查或者自己在一个方向上思考,如果方向错了,很可能越走越远,耽误很多时间。
这里的感悟就是可以先做减法,没用的配置先去掉,减到最小系统后,再做加法去排查问题。
还有一点是权限pojo有个字段是pId,这个字段自动生成的get和set方法是getpId和setpId,并不是首字母大写了。很多工具类或者插件对pojo进行转换时使用对象的get和set方法,比如调用mybatis方法时,返回对象或者对象集合,肯定通过反射或者其他方式获取对象,虽然反射可以打破私有界限,但是你测试后会发现,的确调用了对象的set方法。fastJson将对象转换为json字符串也是通过get方法,即使用getPId和setPId方法,所以最好多写一个get和set方法。
查看资料网址:
https://blog.csdn.net/stationxp/article/details/38775295
https://www.tuicool.com/articles/zeeQfe
https://blog.csdn.net/u010979495/article/details/50610856