Spring 中的自定义数据绑定

Custom Data Binding in Spring

我这里有个情况。假设,我在 @RequestBody

中收到此 JSON
{
    "resourceId": "R0001",
    "refs": [
        {
            "username": "infinite-despair",
            "roleType": "3"
        },
        {
            "username": "faith-knight",
            "roleType": "2"
        },
        .
        .
        .

    ]
}

我绑定到一个 POJO,就像这样。

@PostMapping
public ResponseEntity<SomeModel> addRefs(@RequestBody @Valid ResourceRefRequest req) {...}

现在,ResourceRefRequest,如下,

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResourceRefRequest {

    @NotNull(message = "Resource ID is required")
    private String resourceId;

    @NotEmpty
    private List<@Valid RefReqItem> refs;
}

并且,RefReqItem,如下,

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RefReqItem {

    private String resourceId;

    @NotNull(message = "Username is required")
    private String username;

    @NotNull(message = "Role is required")
    private Integer roleType;
}

一切都很好,正如我所期望的那样。唯一的问题是,对于所有 refsrefReqItem.resourceIdnull。我想用根部的那个填充 refs 中的每个 refReqItem.resourceId;即,resourceRefRequest.resourceId。知道吗,我们怎样才能做到这一点?

谢谢。

ResourceRefRequest 中,您可以创建一个特殊的 setter 供您的 JSON 处理程序使用,在代码中执行您自己的 post-processing:

    @JsonSetter("refs")
    public void setRefsWithResourceId(List<RefReqItem> refs) {
        this.refs = refs.stream()
            .map(ref -> {
                ref.setResourceId(resourceId);
                return ref;
            })
            .collect(Collectors.toList());
    }

当从 JSON 创建 Java 对象时,这个 setter 将被调用,因为该方法具有 setter 的签名并且用 [=12 注释=].