Java &引用;参数类型不匹配“;将@RequestBody的泛型类型与Spring MVC一起使用时出错
我正在尝试为Spring MVC实现一个通用REST控制器:Java &引用;参数类型不匹配“;将@RequestBody的泛型类型与Spring MVC一起使用时出错,java,spring,spring-mvc,generics,payload,Java,Spring,Spring Mvc,Generics,Payload,我正在尝试为Spring MVC实现一个通用REST控制器: 公共抽象类GenericRestController{ 受保护的最终通用服务服务; 公共GenericRequestController(GenericService服务){ 服务=服务; } @RequestMapping(method=RequestMethod.GET) @ResponseStatus(HttpStatus.OK) 公开名单(){ return service.list(); } @RequestMapping(
公共抽象类GenericRestController{
受保护的最终通用服务服务;
公共GenericRequestController(GenericService服务){
服务=服务;
}
@RequestMapping(method=RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
公开名单(){
return service.list();
}
@RequestMapping(method=RequestMethod.POST,consumes=MediaType.APPLICATION\u JSON\u VALUE)
@ResponseStatus(HttpStatus.CREATED)
公共T创建(@RequestBody T entity){
返回服务。创建(实体);
}
//其他基本的REST方法,如get()、delete()等。
}
然后,例如,一个ArticleRestController
:
@RestController
@RequestMapping(value=“/rest/articles”,products=MediaType.APPLICATION\u JSON\u value)
公共类ArticleRestController扩展了GenericRestController{
@自动连线
公共ArticleRestController(ArticleService ArticleService){
超级服务;
}
}
假设一篇文章只有一个名称
字段,字段为字符串
调用GET/rest/articles
时,我会得到预期的持久化文章列表。但是当调用POST/rest/articles{name:“Any Article name”}
时,我发现了以下异常:
java.lang.IllegalStateException:参数类型不匹配
HandlerMethod详细信息:
控制器[com.basepackage.web.controllers.rest.ArticleRestController]
方法[public T com.basepackage.web.controllers.rest.support.GenericRestController.create(T)]
已解决的参数:
[0][type=com.google.gson.internal.LinkedTreeMap][value={name=Any Article name}]
重写ArticleRestController
中的create
方法时,不再引发异常:
@覆盖
@RequestMapping(method=RequestMethod.POST,consumes=MediaType.APPLICATION\u JSON\u VALUE)
@ResponseStatus(HttpStatus.CREATED)
公共文章创建(@RequestBody-Article){
returnarticleservice.create(article);
}
知道为什么吗?可能是Spring在用作@RequestBody
时无法解析泛型类型T
?自Spring 4.1以来,一个实例被添加到HttpMessageConverter
实例列表中,Spring使用该实例序列化从@ResponseBody
注释处理程序方法返回的对象。当前的GsonHttpMessageConverter
不够复杂,无法反序列化泛型类型。因此,当它看到类型变量T
时,它不会尝试将点与extends
子句中的类型参数Article
连接起来,而是使用默认的LinkedTreeMap
一个选项是将jackson2添加到类路径中。Spring将在
GsonHttpMessageConverter
之前注册其。也就是说,它将首先尝试使用它。Jackson的转换器足够智能,可以执行一般的反序列化。您使用的是哪个Spring版本?(建议不要过度泛化。)@SotiriosDelimanolis 4.1.5.release您是否手动注册了Gson
converter?@SotiriosDelimanolis否。my webContext.xml和my pom.xml是否有帮助?从类路径中删除Gson并添加Jackson 2。我很确定Jackson的转换器可以进行通用转换。我对格森没有那么肯定。