Reputation: 39907
I have a situation here. Suppose, I'm receiving this JSON in the @RequestBody
,
{
"resourceId": "R0001",
"refs": [
{
"username": "infinite-despair",
"roleType": "3"
},
{
"username": "faith-knight",
"roleType": "2"
},
.
.
.
]
}
Which I'm binding to a POJO, like so.
@PostMapping
public ResponseEntity<SomeModel> addRefs(@RequestBody @Valid ResourceRefRequest req) {...}
Now, ResourceRefRequest
, is as follows,
@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;
}
and, RefReqItem
, is as follows,
@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;
}
Things are pretty well, as I expect them to be. The only problem is, refReqItem.resourceId
is null
, for all refs
. I want to populate each of, refReqItem.resourceId
, in the refs
, with the one at the root; namely, with, resourceRefRequest.resourceId
. Any idea, how can we achieve this?
Thanks.
Upvotes: 0
Views: 483
Reputation: 105
In ResourceRefRequest
, you can create a special setter for your JSON handler to use, to do your own post-processing in code:
@JsonSetter("refs")
public void setRefsWithResourceId(List<RefReqItem> refs) {
this.refs = refs.stream()
.map(ref -> {
ref.setResourceId(resourceId);
return ref;
})
.collect(Collectors.toList());
}
When creating the Java object from JSON, this setter will be called because the method has the signature of a setter and is annotated with @JsonProperty("refs")
.
Upvotes: 1