java - 使用杰克逊将计算的虚拟属性添加到每个字段
问题描述
我想为我的 DTO 的每个字段添加一个计算属性。
例如我的 POJO 看起来像这样:
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(Include.NON_NULL)
public class UserInfoDto {
private String firstName;
private String lastName;
private String secondLastName;
}
生成的 json 如下所示:
{
"firstName": "foo",
"lastName": "bar",
"secondLastName": "foobar"
}
我的目标是通知我的 API 的调用者每个字段的特定属性(即“可编辑”),我希望它看起来像这样:
{
"firstName": {
"editable": false,
"value": "foo"
},
"lastName": {
"editable": false,
"value": "bar"
},
"secondLastName": {
"editable": true,
"value": "foobar"
}
}
目前我已将 DTO 类更改为如下所示:
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(Include.NON_NULL)
public class UserInfoClientDto {
private Field<String> firstName;
private Field<String> lastName;
private Field<String> secondLastName;
}
@Data
@Builder
public class Field<T> {
@Builder.Default
private boolean editable = true;
private T value;
}
但是这种方式维护起来需要做很多工作。我使用一个“toUserInfoDto”函数来执行一些像这样的丑陋代码:
userInfoClientDto.getFirstName().setEditable(isFirstNameEditable);
userInfoClientDto.getLastName().setEditable(isLastNameEditable);
谁能解释一个更好的方法来实现我需要的东西?
解决方案
创建您自己的以@Field
属性命名的注解editable
,然后创建一个名为FieldSerializer
(参见例如此处)的自定义序列化程序,它使用该注解属性。
它们将像这样使用:
@JsonSerialize(using = FieldSerializer.class)
public class UserInfoClientDto {
@Field(editable = false)
private String firstName;
@Field(editable = false)
private String lastName;
@Field(editable = true)
private String secondLastName;
}
由于您只要求更好的方法,而不是完整的解决方案,我将把自定义序列化程序的实际编写留给您。
推荐阅读
- java - 尝试在 Android Studio (Java) 中制作弹出窗口/叠加层
- flutter - RangeError (index): Invalid value: 如果列表为空,则在做条件时有效值范围为空
- javascript - 尝试更改购物车数量时控制台返回错误
- c - 如何更改 C 函数中的全局变量?
- android - Android - 设置应用程序标签(TextView)的最佳实践从服务器响应
- python - 将巨大的 Pandas HD5 数据帧写入磁盘
- reactjs - 反应:使用补丁包修补 package.json
- r - 使用寓言系列后期使用 xreg 进行分层预测
- css - 如何在与 Vite 的样式绑定中使用资产 URL
- c++ - 我可以让 RealSense 在每次循环刺激时不重新分配内存吗?