首页 > 解决方案 > 使用杰克逊将计算的虚拟属性添加到每个字段

问题描述

我想为我的 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);

谁能解释一个更好的方法来实现我需要的东西?

标签: javajsonjackson

解决方案


创建您自己的以@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;

}

由于您只要求更好的方法,而不是完整的解决方案,我将把自定义序列化程序的实际编写留给您。


推荐阅读