Java泛型无法与JacksonSerlializer一起使用

qoefvg9y  于 2023-05-15  发布在  Java
关注(0)|答案(1)|浏览(96)

我有一个表示通用API响应的类:

@Setter
@Getter
public final class ApiResponse<T> {
    private T data;
}

我在Jackson的帮助下设置了data,如下所示:

class Converter<T> {
  ApiResponse<T> create(){
     // some REST calls and form httpResponse before this step
     ApiResponse<T> apiResponse = new ApiResponse();
     T data = objectMapper
         .readValue(httpResponse.body(), new TypeReference<>() {});
     apiResponse.setData(data);
     return apiResponse;
  }
}

然后我尝试将它与自定义对象一起使用,如下所示:

Converter<MyObject> converter = new Converter<>();
ApiResponse<MyObject> apiResponse = converter.create();

但是我观察到apiResponse.getData()总是返回LinkedHashMap而不是Myobject类型。
下面是MyObject类:

@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public final class MyObject {
  @JsonProperty("childs")
  private ChildObject[] childs;
}

我做错了什么?
下面是http响应体以供参考:

{
  "childs": [
    {
      "freightLineId": "",
      "shipmentId": "",
      "shipmentVersionId": ""
    }
  ]
}
js81xvg6

js81xvg61#

您可以尝试使用泛型方法而不是泛型类,并将类类型作为参数传递到方法内部
Converter.java

public class Converter {
    public static ObjectMapper objectMapper = new ObjectMapper();
    public static <T> T create(String json, Class<T> classType) throws Exception {
        return (T) objectMapper.readValue(json, classType);
    }
}

主码

MyObject obj = Converter.create("{\n"
                    + "  \"childs\": [\n"
                    + "    {\n"
                    + "      \"freightLineId\": \"0001\",\n"
                    + "      \"shipmentId\": \"1000\",\n"
                    + "      \"shipmentVersionId\": \"1.0\"\n"
                    + "    }\n"
                    + "  ]\n"
                    + "}", MyObject.class);
            
System.out.println(obj.getChilds());

代码ApiResponse<T>

public class Converter {
    public static ObjectMapper objectMapper = new ObjectMapper();
    public static <T> ApiResponse<T> create(String json, Class<T> classType) throws Exception {
        ApiResponse<T> res = new ApiResponse<>();
        res.setData((T) objectMapper.readValue(json, classType));
        return res;
    }
}

主码

ApiResponse<MyObject> obj = Converter.create("{\n"
                    + "  \"childs\": [\n"
                    + "    {\n"
                    + "      \"freightLineId\": \"0001\",\n"
                    + "      \"shipmentId\": \"1000\",\n"
                    + "      \"shipmentVersionId\": \"1.0\"\n"
                    + "    }\n"
                    + "  ]\n"
                    + "}", MyObject.class);
System.out.println( obj.getData().getChilds() );

相关问题