En Spring, ¿es posible usar @JsonView en objetos de parámetros de consulta de URL? Puedo hacerlo para @RequestBody pero no tenemos cuerpos en las solicitudes GET. Esta pregunta es específicamente para los parámetros de consulta de URL que Spring ha convertido en objetos.
Por ejemplo, quiero tener un controlador con este mapeo:
@GetMapping("/user") ResponseEntity<UserDTO> searchUser(@JsonView(value = UserView.Searchable.class) UserDTO userQuery) { //Do some work here using userQuery object for searching users return ResponseEntity.ok(); } UserDTO :
public class UserDTO { @JsonProperty("id") @JsonView(UserView.Private.class) private String id= null; @JsonView(UserView.Searchable.class) @JsonProperty("city") private String city = null; @JsonProperty("country") @JsonView(UserView.Searchable.class) private String country = null; @JsonProperty("state") private String state = null; @JsonProperty("zipCode") private String zipCode = null; //More properties and getter/setters...etc } Entonces, si quisiera llamar al punto final, podría crear una URL como localhost:8080//api/user?country=Canada para buscar un usuario en Canadá, pero si probara localhost:8080//api/user?id=123 , la propiedad sería ignorada.
EDITAR: Podría haber apresurado esta idea. No hay deserialización JSON de los parámetros de URL porque no son JSON. Spring crea el objeto de consulta desde ServletModelAttributeMethodProcessor . Quizás si quiero un comportamiento personalizado, necesito implementar HandlerMethodArgumentResolver y hacerlo yo mismo.
EDITAR 2 Soy un poco nuevo en Spring, así que tengo mucho que aprender, pero creo que lo que haré es usar @InitBinder para incluir en la lista blanca los campos para enlazar
@InitBinder public void setSearchableFields(WebDataBinder binder) { binder.setAllowedFields( "city", "country" ); }En uno de mis proyectos, he usado un POJO solo para los parámetros de consulta. Dudo que alguna propiedad sea ignorada por defecto en primavera, puede tener cheques nulos para ignorar.
QueryParams.java
@Data public class QueryParams { Integer page; Integer pageSize; String sortBy; Sort.Direction direction; String searchId; String status; String symbol; public PageRequest getPageRequest(){ if(this.page==null){ this.page = 0; } if(this.pageSize==null){ this.pageSize = 25; } if(this.sortBy==null){ this.sortBy = "createdAt"; } if(this.direction ==null){ this.direction = Sort.Direction.DESC; } return PageRequest.of(this.page, this.pageSize, Sort.by(this.direction, this.sortBy)); } }Y mi controlador:
@GetMapping("currencies") public ResponseEntity<Page<CurrencyConfig>> getAllCurrencies(@Valid QueryParams queryParams) { try { return ResponseEntity.ok(orderbookService.getAllCurrencyConfig(queryParams)); } catch (HttpClientErrorException | HttpServerErrorException e) { throw new ResponseStatusException(e.getStatusCode(), e.getMessage()); } catch (Exception e) { e.printStackTrace(); throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, e.getLocalizedMessage()); } }