I have a controller method annotated with @JsonView. The current requirement is to have this same method return the response using a different JsonView if the userId given in parameter matches the authenticated user. How to achieve this knowing that response type should remain ResponseEntity<MyObject> and should not be changed to MappingJacksonValue or the sorts.
I'm using Spring, so maybe a way to do this is to have the default JacksonMapper injected and change its SerializationView depending on a condition within the method. But the question here is, what to inject and how to achieve this?
// Some controller annotations
@JsonView(Views.Public.class)
public static ResponseEntity<User> getUser(@PathVariable String userId)
User user = userService.getUser(userId);
User authenticated = userService.getAuthenticatedUser();
if (userId.equals(authenticated.getId())) {
// Change the view class to Views.Restricted.class
}
return new ResponseEntity<>(user, HttpStatus.OK);
}
Solved it by Injecting the spring default ObjectMapper and changing its config with the appropriate View class:
@Autowired
private ObjectMapper defaultMapper;
//...
public static ResponseEntity<User> getUser(@PathVariable String userId)
User user = userService.getUser(userId);
User authenticated = userService.getAuthenticatedUser();
if (userId.equals(authenticated.getId())) {
defaultMapper.setConfig(defaultMapper.getSerializationConfig().withView(Views.Restricted.class));
} else {
defaultMapper.setConfig(defaultMapper.getSerializationConfig().withView(Views.Public.class));
}
return new ResponseEntity<>(user, HttpStatus.OK);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With