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;
}

一切都很好,正如我所期望的那样。唯一的问题是,对于所有的refs来说,refReqItem.resourceId就是null。我想在refs中填充每个refReqItem.resourceId,在根处填充一个;即具有resourceRefRequest.resourceId。有什么想法吗,我们如何才能做到这一点?

谢谢。

ResourceRefRequest中,您可以为JSON处理程序创建一个特殊的setter,以便在代码中进行自己的后处理:

@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的签名,并用@JsonProperty("refs")进行注释。

最新更新