使用Spring MVC对Java中的JSON和Generics进行编组

Cra*_*his 11 java json spring-mvc jackson

我正在尝试将JSON对象编组到包含通用对象的包装类中,以及有关该对象签名的其他信息.

public class Signable<T> {

    private T object;
    private String signature;

    public class Signable() {
       generateSignature();
    }

    /* Getters and setters  */
}
Run Code Online (Sandbox Code Playgroud)

只要我使用已创建的对象构造它,包装器类就可以正常工作,并且它能够生成所需的json

@RequestMapping(value="/test/json/return",method=RequestMethod.GET)
public @ResponseBody Signable<Cart> getTest()
{
    Cart cart = new Cart();
    // populate cart with OrderItems ...
    Signable<Cart> sign = new Signable<Cart>();
    sign.setObject(cart);
    return sign;
}
Run Code Online (Sandbox Code Playgroud)

它能够产生预期的输出

{
   "object":{
        "orderItems":[
              {
                  "id": "****",
                  "desc": "asdlfj",
                  "price": 25.53
              }
        ]
   },
   "signature":"s9d94f9f9gdfg67d8678g6s87d6f7g6";
}
Run Code Online (Sandbox Code Playgroud)

这是我想要的格式.但是,当尝试将从Signable生成的相同json编组回Signable时,我收到以下错误:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to Cart
Run Code Online (Sandbox Code Playgroud)

由于某种原因,它无法确定json中的"对象"应该映射到Cart的类型(它只是默认为LinkedHashMap),即使它在方法头中指定.

@RequestMapping(value="/test/json/post",method=RequestMethod.POST)
public @ResponseBody Signable<Cart> postTest(@RequestBody Signable<Cart> sign)
Run Code Online (Sandbox Code Playgroud)

有没有办法明确说明要从JSON生成哪些类型的对象来代替通用?

任何帮助将不胜感激.

谢谢.

Sta*_*Man 10

这里的问题是传递正确的类型信息,填写缺少的信息(由于Java类型擦除而发生).

但最简单的方法通常是你想要的子类型,有类似的东西:

class CartSignable extends Signable<Cart>  { }
Run Code Online (Sandbox Code Playgroud)

并使用它,而不是构建通用实例; 如果是这样,则正确包含类型信息(因为它存储在CartSignable的类定义中;而Signable只有类型变量!).

Jackson也可以在序列化过程中接收类型信息,但这里的问题是Spring如何传递这些信息.因此,通常使用子分类风格更容易.请注意,您也可以使用匿名内部类进行子类化.