两天后,我坚持以下......
如果我在控制器中指定类型,它可以工作:
@RestController
public class FooController {
@RequestMapping(method = RequestMethod.POST)
protected ResponseModel bar(@Valid @RequestBody Foo foo) {
// here I have foo of type Foo
}
}
但是,如果我尝试利用泛型,它就不起作用了:
public class Base<U> {
@RequestMapping(method = RequestMethod.POST)
protected ResponseModel bar(@Valid @RequestBody U entity) {
// here I get java.util.LinkedHashMap instead of U
// which, in the FooController, should be Foo
}
}
@RestController
public class FooController extends Base<Foo> {
}
查看日志,当它以定义的类型命中控制器时,我得到:
Read [class com...Foo] as "application/json;charset=UTF-8" with [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@cee662]
在通用的那个:
Read [U] as "application/json;charset=UTF-8" with [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@cee662]
问:我应该怎么做才能利用通用类型,并能够从控制器中删除重复的代码?
注意:这不是重复,因为所有其他问题都是关于List<T>
或来自~2.6的问题。*
附录:Yuri-M-Dias建议降级,我做了,所以2.5.5适用于通用类型,但2.8.4没有。 (至少现在我有一个糟糕的,很好的修改版本......)
进一步降级......
我发现版本2.7.9很好,我从Foo
获得U
,而在2.8.0我得到LinkedHashMap<K,V>
...也许我遗漏了2.8.0 release的内容?
答案 0 :(得分:0)
我不知道您是否碰巧看到Generic Controller in Spring MVC,但它可能具有指导意义。尽管如此,我对我将要描述的内容感到不满意,因为我看到你上面要做的事情。另外,我不能告诉你可能的“必要性”背后的原因。希望其他人能够填补它。
@RestController
public class FooController extends Base<Foo> {
@RequestMapping(method = RequestMethod.POST)
protected ResponseModel bar(@Valid @RequestBody Foo foo) {
super.bar(foo);
}
}
似乎应该让一切都快乐。