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;
}
一切都很好,正如我所期望的那样。唯一的问题是,对于所有 refs
,refReqItem.resourceId
是 null
。我想用根部的那个填充 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 注释=].
我这里有个情况。假设,我在 @RequestBody
、
{
"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
中,您可以创建一个特殊的 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 注释=].