Spring(4.2.6)+ Jackson(2.8.4)+泛型类型:java.util.LinkedHashMap无法强制转换为

时间:2017-03-10 14:44:11

标签: java spring jackson

两天后,我坚持以下......

如果我在控制器中指定类型,它可以工作:

@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的内容?

1 个答案:

答案 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);
    }
}

似乎应该让一切都快乐。