I have an api entity User with internal and external business fields
My goals:
- Restrict Controller from seeing external field if endpoint POST /internal is being used
- Restrict Controller from seeing internal field if endpoint POST /external is being used
@PostMapping("/internal")
public UserV1 postInternal(@RequestBody @JsonView(Views.Internal.class) UserV1 user) {
requireNull(user.externalId(), "'externalId' must be null for /internal endpoint");
return user;
}
For some reason this code only works if i annotated field with two annotations
public record UserV2(
...
@JsonView(Views.External.class)
@JsonProperty("externalId") // Without this annotation JsonView is ignored by Controller
String externalId
) {}
Repo that reproduce this issue https://github.com/bitxon/spring-json-view-experiment
Repo description
- UserV2 works fine for Request Body because it has both annotation @JsonView and @JsonProperty
- UserV1 does not work for Request Body because it has only @JsonView
Comment From: bitxon
I dived deeper to a problem, appears that issue is on Jackson side
fortunately this issue fixed in latest Jackson version 2.15.0
Solution
dependencies {
...
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.0'
}