gpt4 book ai didi

java - Spring + Jackson + 反序列化通用对象列表

转载 作者:行者123 更新时间:2023-11-30 04:02:02 25 4
gpt4 key购买 nike

我有以下 Controller :

@RequestMapping(value = "/test/inst/", method = RequestMethod.POST)
public @ResponseBody ResponseDTO<InstDTO>
testPostREST(@RequestBody RequestDTO<InstDTO> instDTO) {

RequestDTO<InstDTO> dto = new RequestDTO<InstDTO>();

ResponseDTO<InstDTO> responseDto = new ResponseDTO<InstDTO>();
responseDto.setPayload(instDTO.getPayload());
return responseDto;
}

具有以下请求对象:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class RequestDTO<T> {

private List<T> payload;

public RequestDTO() {
System.out.println("constructor");
}

public RequestDTO(List<T> payload) {
this.payload = payload;
}

public List<T> getPayload() {
return payload;
}

public void setPayload(List<T> payload) {
this.payload = payload;
}
}

当 POST 完成并且我查看得到的对象时,有效负载列表具有 LinkedHashMap 对象,而不是我的 DTO 类型的对象。

如何让 spring+jackson 将 JSON 转换为我的 DTO 对象。请记住,我计划将包装器 ResponseDTO 重用于其他对象列表,这就是我使用通用列表 (List) 的原因。

这是我正在尝试的 JSON。

{
"payload": [
{
"d": "Test 0",
"id": "abcde",
"c": "Test 0"
},
{
"d": "Test 1",
"id": "123",
"c": "Test 1"
}
]
}

最佳答案

由于类型删除,您的代码无法工作。 Jackson 运行时不知道您正在尝试将有效负载编码(marshal)到 InstitutionDTO对象(因为该信息已在编译时被删除)。当 Jackson 查看有效负载时,它会看到线路上有效的 JSON 对象和 List<Object>在Java方面。它别无选择,只能将有效负载映射到 Map实现,在你的情况下似乎是 LinkedHashMap .

您也许能够实现您正在寻找的目标,如下所示:

class RequestDTO<T> {}
class ResponseDTO<T> {}
class InstitutionDTO {}
class InstitutionRequestDTO extends RequestDTO<InstitutionDTO>
class InstitutionResponseDTO extends ResponseDTO<InstitutionDTO>

@RequestMapping(value = "/test/institution/", method = RequestMethod.POST)
public @ResponseBody InstitutionResponseDTO
testPostREST(@RequestBody InstitutionRequestDTO institutionDTO) { }

免责声明:我自己没有尝试过此代码,但我的大多数应用程序都有与此类似的代码,并且它可以与 Jackson、Castor、Atom 等一起使用,没有任何故障。

关于java - Spring + Jackson + 反序列化通用对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com