Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;参数类型不匹配“;将@RequestBody的泛型类型与Spring MVC一起使用时出错_Java_Spring_Spring Mvc_Generics_Payload - Fatal编程技术网

Java &引用;参数类型不匹配“;将@RequestBody的泛型类型与Spring MVC一起使用时出错

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(

我正在尝试为Spring MVC实现一个通用REST控制器:

公共抽象类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的转换器可以进行通用转换。我对格森没有那么肯定。