gpt4 book ai didi

java - 使用jackson将子类属性包装成子键

转载 作者:行者123 更新时间:2023-12-01 09:15:11 25 4
gpt4 key购买 nike

我的 REST 服务需要返回以下格式的消息:

{
"code": 1000,
"message": "Success",
"description": null,
"data": [
{
"custId": "00000023401443",
"engName": "MISTER NORWAYTEST'S PASSPORT",
}
]
}

其中 JSON 消息的第一层基本上类似于消息头,用于提供有关消息传递的技术详细信息,而“data”键包含实际的业务信息。

如果我要创建一个类来反射(reflect)这一点,默认情况下我会得到如下所示的内容:

public class ResponseModel<T> implements Serializable{
private Integer code;
private String message;
private String description;
@JsonProperty(value = "data")
private T dataObj;
}

但这样做会导致我的 Controller 全部返回相同的对象,而类名没有真正的业务上下文值,并降低了可读性:

@GetMapping("/profile/{userId}")
public ResponseEntity<ResponseModel> getProfile(@PathVariable String userId) {
...
}

我想做的是使用 ResponseModel 作为父类(super class),然后将它们继承到具有真实业务上下文名称(例如客户或帐户)的子类中。但为了遵守所需的 JSON 格式,我需要确保子类的属性包装到“data”键中。

有什么办法可以做到这一点吗?使用 @JsonRootName 也会包装父类(super class)属性。

最佳答案

您想要的格式的问题就在这里:

"data": *[* <---- HERE THAT BRACKET

如果您想要一个括号,这意味着您的数据是一个列表,因此您需要通过将 dataObj 设为列表来修复它:

@JsonProperty(value = "data")
private List<T> dataObj;

现在我不明白子类化 ResponseModel 的意义,您可以执行以下操作:

public ResponseEntity<ResponseModel> myControllerMethod(){
List<Account> list = myService.readAccounts();
return new ResponseModel<Account>(list);//default code OK,...
}

如果您让业务类继承 ResponseModel,它只是处理 Controller 结果的包装器,那么您会将业务层与 Controller 的特定层混合在一起,这不是一个好主意。

but doing it this way causes my controllers to all return the same object with no real business context value to the class name and reduces readability:

在 Java 的 Controller 中,您应该有非常非常少的行,基本上,调用服务,检查答案/处理异常,返回响应。所以我没有看到任何可读性问题,因为如果这样。如果您谈论通用返回值,只需正确命名您的方法即可。

关于java - 使用jackson将子类属性包装成子键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40605887/

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