`
jinnianshilongnian
  • 浏览: 21419959 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2402277
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2995477
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5629909
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257013
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1592395
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248699
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5845059
Group-logo
跟我学Nginx+Lua开...
浏览量:697267
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:779642
社区版块
存档分类
最新评论

扩展SpringMVC以支持绑定JSON格式的请求参数

阅读更多

 

上一篇:《扩展SpringMVC以支持更精准的数据绑定》

 

此方案是把请求参数(JSON字符串)绑定到java对象,,@RequestBody是绑定内容体到java对象的。

 

问题描述:

你好,对于如下的json数据,springmvc的数据绑定该如何做? 
accessionDate	2012-11-21 
deptIds	[{"deptId":4,"isPrimary":true}] 
email	ewer@dsfd.com 
fax	3423432 
gender	true 
其实就是我前台一表单提交的数据,extjs form提交的,关键在于deptIds的映射,数组不知怎么解决,还有就是springmvc的数据绑定好像要求javabean与json中的数据一一对应,否则也会出错

 

 如请求参数是deptIds={"deptId":4,"isPrimary":true}]  是一个json数组,此时需要绑定为一个对象,该如何实现呢?

 

解决方案:

类似于之前写的《扩展SpringMVC以支持更精准的数据绑定》扩展spring的HandlerMethodArgumentResolver以支持自定义的数据绑定方式。

 

1、请下载附件的代码,放到工程中;

2、在RequestMappingHandlerAdapter添加自定义HandlerMethodArgumentResolver Bean;

     <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
        <!--线程安全的访问session-->
         <property name="synchronizeOnSession" value="true"/> 
         <property name="customArgumentResolvers">
            <list>
               <bean class="cn.javass.spring.mvc.method.annotation.RequestJsonParamMethodArgumentResolver"/>
               <bean class="cn.javass.spring.mvc.method.annotation.FormModelMethodArgumentResolver"/>
            </list>
         </property>
     </bean>  

  //customArgumentResolvers用于注入自定义的参数解析器,此处我们注入了RequestJsonParamMethodArgumentResolver

3、使用方式

@RequestMapping("/list")  
public String list(@RequestJsonParam("list") List<Integer> list) 

 

4、测试控制器

package cn.javass.chapter6.web.controller.jsonparam;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import cn.javass.chapter6.model.DataBinderTestModel;
import cn.javass.chapter6.model.UserModel;
import cn.javass.spring.mvc.bind.annotation.RequestJsonParam;
import cn.javass.spring.mvc.util.MapWapper;


@Controller
@RequestMapping("/jsonparam")  
public class JsonParamController {

    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/list?list=[1,2,34]
    //fail http://localhost:9080/springmvc-chapter6/jsonparam/list?list=[1,2,a]
    @RequestMapping("/list")  
    public String list(@RequestJsonParam("list") List<Integer> list) {
        System.out.println(list);
        return "redirect:/success";        
    }
    
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/set?set=[1,2,34]
    //fail http://localhost:9080/springmvc-chapter6/jsonparam/set?set=[1,2,a]
    @RequestMapping("/set")  
    public String set(@RequestJsonParam("set") Set<Integer> set) {
        System.out.println(set);
        return "redirect:/success";        
    }
    
    
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/array?array=[1,2,3]
    //fail http://localhost:9080/springmvc-chapter6/jsonparam/array?array=[1,2,a]
    @RequestMapping("/array")  
    public String list(@RequestJsonParam("array") int[] array) {
        System.out.println(Arrays.toString(array));
        return "redirect:/success";        
    }
    
    
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/map?map={"a":1, "b":2}
    //fail http://localhost:9080/springmvc-chapter6/jsonparam/map?map={"a":1, "b":a}
    @RequestMapping("/map")  
    public String map(@RequestJsonParam(value = "map", required=false) MapWapper<String, Integer> map) {
        System.out.println(map);
        return "redirect:/success";        
    }
    
    
    //UserModel[]
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/array2?array=[{"username":"123"},{"username":"234"}]
    @RequestMapping("/array2")  
    public String array2(@RequestJsonParam(value = "array") UserModel[] array) {
        System.out.println(Arrays.toString(array));
        return "redirect:/success";        
    }

    //List<UserModel>
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/list2?list=[{"username":"123"},{"username":"234"}]
    @RequestMapping("/list2")  
    public String list2(@RequestJsonParam(value = "list") List<UserModel> list) {
        System.out.println(list);
        return "redirect:/success";        
    }

    //Set<UserModel>
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/set2?set=[{"username":"123"},{"username":"234"}]
    @RequestMapping("/set2")  
    public String set2(@RequestJsonParam(value = "set") Set<UserModel> set) {
        System.out.println(set);
        return "redirect:/success";        
    }
    
    //Map<String, UserModel>
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/map2?map={"a":{"username":"123"},"b":{"username":"234"}}
    //暂不支持 Map<UserModel, UserModel>
    @RequestMapping("/map2")  
    public String map2(@RequestJsonParam(value = "map") MapWapper<String, UserModel> map) {
        System.out.println(map);
        return "redirect:/success";        
    }
    
    
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/model1?model={"username":123,"password":234,"realname":"zhang","workInfo":{"city":"abc","job":"abc","year":"abc"}, "schoolInfo":{"schoolType":"1","schoolName":"1","specialty":"1"}}
    //没有realname1
    //fail http://localhost:9080/springmvc-chapter6/jsonparam/model1?model={"username":123,"password":234,"realname1":123}
    @RequestMapping("/model1")  
    public String model1(@RequestJsonParam(value = "model", required=true) UserModel user) {
        System.out.println(user);
        return "redirect:/success";        
    }
    
    //ENUM
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/model2?model={"state":"normal"}
    //List<基本类型>
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/model2?model={"hobbyList":["film", "music"]}
    //Map<基本类型,基本类型>
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/model2?model={"map":{"key":"value", "a":"b"}}    
    @RequestMapping("/model2")  
    public String model2(@RequestJsonParam(value = "model", required=true) DataBinderTestModel model) {
        System.out.println(model);
        return "redirect:/success";        
    }
    
    //List<UserModel>
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/model3?model={"userList":[{"username":"1"},{"username":"2"}]}
    //Map<String,UserModel>
    //ok   http://localhost:9080/springmvc-chapter6/jsonparam/model3?model={"userMap":{"1":{"username":"1"},"2":{"username":"2"}}}

    //暂不支持 类似于 Map<UserModel, UserModel> 形式
    @RequestMapping("/model3")  
    public String model3(@RequestJsonParam(value = "model") DataBinderTestModel model) {
        System.out.println(model);
        return "redirect:/success";        
    }
    
}

 

支持的spring版本:

springmvc 3.0 和 3.1.x。

 

支持绑定的数据:

模型、集合、数组、MapWapper(Map的一个包装器,通过getInnerMap获取真实Map)

 

暂时不支持JSR-303数据校验.

 

缺点:

1、和《扩展SpringMVC以支持更精准的数据绑定》一样的缺点。

spring自定义的参数解析器会放在默认解析器之后,不能指定order,因此如果我们@FormModel("map") Map map,此map会变成Model(请参考http://jinnianshilongnian.iteye.com/blog/1698916 第六部分、Model Map ModelMap),希望未来的版本支持自定义顺序来解决这个问题;此处我们使用MapWapper解决,可以通过MapWapper.getInnerMap()拿到我们需要的Map。

2、支持的jackson版本是1.4.2,版本比较老,spring3.2里程碑版已升级到2.x。

3、暂时没有提供JSR303数据校验。

 

欢迎大家反馈问题,我会及时修正。

 

18
3
分享到:
评论
49 楼 sbwfgihc 2016-09-22  
mikeghgh 写道
谢谢您的分享,很大程度上帮助了我,非常感谢,疑惑的是为什么spring没考虑这类Jackson绑定的问题,是不是这个版本如此而已,现在spring mvc 4对此类Jackson的绑定有提供解决方案吗?


对啊,spring4.0这个对这个有更好的绑定吗
48 楼 mikeghgh 2015-12-25  
谢谢您的分享,很大程度上帮助了我,非常感谢,疑惑的是为什么spring没考虑这类Jackson绑定的问题,是不是这个版本如此而已,现在spring mvc 4对此类Jackson的绑定有提供解决方案吗?
47 楼 qq421153173 2015-09-17  
qq421153173 写道
我按照以上说的写的,然后在请求controller的时候报错。500 解析失败。请帮忙。用的版本是3.2.1 ,请绑我看看。错误信息:
Caused by: java.lang.NoSuchMethodException: [Ldkd.paltform.authority.domain.RoleAuthority;.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:105)
... 71 more
------------------------------------------------------------
有默认的构造器。

46 楼 qq421153173 2015-09-17  
我按照以上说的写的,然后在请求controller的时候报错。500 解析失败。请帮忙。用的版本是3.2.1 ,请绑我看看。错误信息:
Caused by: java.lang.NoSuchMethodException: [Ldkd.paltform.authority.domain.RoleAuthority;.<init>()
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:105)
... 71 more
------------------------------------------------------------
有默认的构造器。
45 楼 ymc1989 2014-10-12  
<!-- 添加注解驱动 -->
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean
class="com.ds365.erp.procurement.rest.JsonParamMethodArgumentResolver" />
</mvc:argument-resolvers>

<mvc:message-converters>
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
<value>html/text;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

用Github 上 自定义json 参数解析器,为什么解析不了 json 格式,
在参数中 注入 HTTPservletRequest 也parameterMap 也为 {}

以下为请求内容
Remote Address:127.0.0.1:8080
Request URL:http://localhost:8080/procurement-interface/a/testParamBean
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:application/json
Accept-Encoding:gzip,deflate
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Content-Length:40
Content-Type:application/json
Cookie:JSESSIONID=B192BFADD97FC0B19AF30A5E5E10E557
Host:localhost:8080
Origin:http://localhost:8080
Referer:http://localhost:8080/procurement-interface/doc/index.jsp
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36
X-Requested-With:XMLHttpRequest
Request Payloadview source
{id:0.1, age:0, name:string}
age: 0
id: 0.1
name: "string"
Response Headersview source
Content-Type:application/json;charset=UTF-8
Date:Sun, 12 Oct 2014 06:24:31 GMT
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

您好,能指教一下吗?
spring 版本为 3.1.4
44 楼 lsh3d 2014-07-19  
楼主,怎么才能让它支持JSR-303数据校验?支持@Valid
43 楼 alfa.wu 2014-04-03  
博主, 我加了之后,也能解析了,但是和 @ResponseBody  冲突了..
用上 @ResponseBody 后,就报 406 错误
以下是我的配置,参数是能够解析了. 能不能把这个问题解决一下,解决了,就完美了.

	<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
	<context:component-scan base-package="com.yc.controller" />
		<!-- 用于设置  RequestJsonParam -->
	<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">   
         <!-- 线程安全的访问session  -->  
         <property name="synchronizeOnSession" value="true"/>   
         <property name="customArgumentResolvers">  
            <list>  
               <bean class="cn.javass.spring.mvc.method.annotation.RequestJsonParamMethodArgumentResolver"/>  
               <bean class="cn.javass.spring.mvc.method.annotation.FormModelMethodArgumentResolver"/>  
            </list>  
         </property>  
     </bean>
	<mvc:annotation-driven/>


	<!-- Spring MVC JSON配置 -->
	<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>text/html;charset=UTF-8</value>
			</list>
		</property>
	</bean>
	
	<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="mappingJacksonHttpMessageConverter" /><!-- json转换器 -->
			</list>
		</property>
	</bean>
42 楼 alfa.wu 2014-04-03  
博主, 我加了之后,也能解析了,但是和 @ResponseBody  冲突了..
用上 @ResponseBody 后,就报 406 错误
41 楼 jinnianshilongnian 2013-11-25  
mienimaer 写道
文中提到支持spring 3.0,那么支持3.0.5.RELEASE吗?我使用OSGI,所以不能升级到spring的新版本,只能用3.0.5.RELEASE,按文中所配置,发现很多spring的class都没有。

那不是说明缺jar包嘛,报的是哪个类?
40 楼 mienimaer 2013-11-25  
文中提到支持spring 3.0,那么支持3.0.5.RELEASE吗?我使用OSGI,所以不能升级到spring的新版本,只能用3.0.5.RELEASE,按文中所配置,发现很多spring的class都没有。
39 楼 jqzyjack 2013-11-05  
caizi12 写道
jqzyjack 写道
jinnianshilongnian 写道
caizi12 写道
需要给UserModel设置什么注解吗

你仔细看看这篇文章就知道了,都写的很明确了

我也出现你的问题,找到原因了

得把
<!-- 默认的注解映射的支持 -->
<!-- <mvc:annotation-driven /> -->

<!-- <mvc:default-servlet-handler /> -->
注释掉,不然会调用默认的Servlet处理器,就是涛大说的那个问题!
希望能解决你的问题


我看了,我的之前就没这两个配置,也会报这个错,你能把你配置发给我吗。

1.
<!--Spring3.1开始的注解 HandlerMapping:将请求的URL和Bean名字映射 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
<!--Spring3.1开始的注解 HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="synchronizeOnSession" value="true"/>
    <property name="customArgumentResolvers">
    <list>  
       <bean class="com.student.convertor.RequestJsonParamMethodArgumentResolver"/>  
       <bean class="com.student.convertor.FormModelMethodArgumentResolver"/>  
    </list>
</property>
</bean>

2.
	<bean class="com.student.controller.JsonParamController"/>
	<bean class="com.student.controller.FormModelController"/>

我的SpringMVC.xml就加了这两个!
38 楼 caizi12 2013-11-05  
jqzyjack 写道
jinnianshilongnian 写道
caizi12 写道
需要给UserModel设置什么注解吗

你仔细看看这篇文章就知道了,都写的很明确了

我也出现你的问题,找到原因了

得把
<!-- 默认的注解映射的支持 -->
<!-- <mvc:annotation-driven /> -->

<!-- <mvc:default-servlet-handler /> -->
注释掉,不然会调用默认的Servlet处理器,就是涛大说的那个问题!
希望能解决你的问题


我看了,我的之前就没这两个配置,也会报这个错,你能把你配置发给我吗。
37 楼 jqzyjack 2013-11-05  
jinnianshilongnian 写道
caizi12 写道
需要给UserModel设置什么注解吗

你仔细看看这篇文章就知道了,都写的很明确了

我也出现你的问题,找到原因了

得把
<!-- 默认的注解映射的支持 -->
<!-- <mvc:annotation-driven /> -->

<!-- <mvc:default-servlet-handler /> -->
注释掉,不然会调用默认的Servlet处理器,就是涛大说的那个问题!
希望能解决你的问题
36 楼 jinnianshilongnian 2013-11-04  
caizi12 写道
需要给UserModel设置什么注解吗

你仔细看看这篇文章就知道了,都写的很明确了
35 楼 caizi12 2013-11-04  
需要给UserModel设置什么注解吗
34 楼 caizi12 2013-11-04  
jinnianshilongnian 写道
caizi12 写道
用了之后怎么有这个错呢,不都是接口吗?我是spring3.1的。
2013-11-02 21:52:57,434 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101)
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131)
	at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)



instantiateClass(BeanUtils.java:101)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.met

从错误看 它走了@ModelAttribute  你是不是使用错了注解啊


刚开始把这几个类放进去,然后按上面的配置配置好,一访问就这样,后来用你的测试用例也是提示这样的异常。
33 楼 jinnianshilongnian 2013-11-03  
caizi12 写道
用了之后怎么有这个错呢,不都是接口吗?我是spring3.1的。
2013-11-02 21:52:57,434 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101)
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131)
	at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)



instantiateClass(BeanUtils.java:101)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.met

从错误看 它走了@ModelAttribute  你是不是使用错了注解啊
32 楼 caizi12 2013-11-02  
用了之后怎么有这个错呢,不都是接口吗?我是spring3.1的。
2013-11-02 21:52:57,434 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101)
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131)
	at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)
31 楼 awm96 2013-09-27  
我在spring3.2.4版本下使用这个resolver发现个问题,楼主为了向下兼容实现了WebArgumentResolver,但在spring3.2.4下引发了一个问题,就是系统启动后,如果第一次解析参数出现错误,则resolver注册直接失败,后续不在生效! 需要去掉对WebArgumentResolver的实现!
30 楼 jinnianshilongnian 2013-05-31  
wzm1195 写道
jinnianshilongnian 写道
wzm1195 写道
wzm1195 写道
博主,请教一下,怎么实现jsp上的json对象和处理类的List绑定?

我感觉和博主的这篇文章内容很相似,但是却实现不了!

没太明白你的意思,能否给个简单的示例

如tuser有4个属性,我在jsp上面用easyui添加了4条tuser记录,提交后怎么配置才能使处理器对应方法的参数List<tuser>的内容为提交的内容?我用DataBinderTestModel总是得到为null。


1、你试试直接使用 数组/List<Model>即可啊

不需要使用我这个注解  场景不一样

我这个注解是当
http://localhost:9080/springmvc-chapter6/jsonparam/model3?model={"userList":[{"username":"1"},{"username":"2"}]} 

传输的数据是json字符串时才有用

http://jinnianshilongnian.iteye.com/blog/1705701

相关推荐

Global site tag (gtag.js) - Google Analytics