springmvc 配置了自动json转换,但是得到了500错误,控制台没有报错。

looyo 2015-02-09
springmvc4.1.4

下面是控制器的部分代码, queryLst 是个List,装载的是LoginUser 实例,LoginUser也是hibernate的pojo类,是主从结构的。从表内容放在其一个类型为Set的集合类中。当这个集合类不为空时,请求"sysmng/queryUsers" 得到500错误。当这个集合类为空时,一切正常。我推测是json自动转换的处理出了问题,但是我在eclipse中调试时,控制台并没有输出任何异常。不管是集合类为空还是不为空,跟踪控制器代码时,都能正常走完queryUsers 中所有步骤。

 @RequestMapping(value = "sysmng/queryUsers", method = RequestMethod.POST)
    public @ResponseBody ModelMap queryUsers(@RequestBody ModelMap map)
    {

        //这边省略了部分代码
        ModelMap result = new ModelMap();
        result.put("draw", draw);
        long count = ((Long) countLst.get(0)).longValue();
        result.put("recordsFiltered", count);
        result.put("recordsTotal", count);
        result.put("data", queryLst);
        return result;
    }


下面是*-servlet.xml的内容
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/tx 
     	   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     	   http://www.springframework.org/schema/mvc
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

	<context:component-scan base-package="looyo.xsystem.web"></context:component-scan>
	<mvc:annotation-driven />
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView"></property>
		<property name="prefix" value="/"></property>
		<property name="suffix" value=".html"></property>
	</bean>

	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="jsonHttpMessageConverter" />
			</list>
		</property>
	</bean>

	<bean id="jsonHttpMessageConverter"
		class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />

	<bean id="exceptionResolver"
		class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
		<property name="defaultErrorView">
			<value>/error/error</value>
		</property>
		<property name="defaultStatusCode">
			<value>500</value>
		</property>
		<property name="warnLogCategory">
			<value>org.springframework.web.servlet.handler.SimpleMappingExceptionResolver
			</value>
		</property>
	</bean>


</beans>

hss118100 2015-02-16
这个应该是hibernate代理对象的问题,一般出现在hibernate多对一和一对多关联的时候。解决办法有两种,一种是把hibernate的代理对象变成实际对象,另一种就是不要用ResponseBody注解,使用MappingJacksonJsonView做解析,一般是可以解决这个问题的
json20080301 2015-02-20
ModelMap result = new ModelMap();  
  使用Map result = new HashMap();
looyo 2015-03-05
问题解决了。 LoginUser 中有many to many关系(注解方式配置),而默认是懒加载的。
改成fetch=FetchType.EAGER 就OK了。
aflyt 2015-03-25
不使用hibernate的LAZY不好吧?Set的数据前台是真的需要显示吗?为什么不加层DTO?个人理解哈~
looyo 2015-05-07
aflyt 写道
不使用hibernate的LAZY不好吧?Set的数据前台是真的需要显示吗?为什么不加层DTO?个人理解哈~



直接原因找到了,至于你说的问题,可以寻求其他的方法来解决。
Global site tag (gtag.js) - Google Analytics