2016-02-02 13 views
5

Sto usando api di appoggio a molla 4.x. Abbiamo il requisito di filtrare i campi nella risposta in base ai parametri della richiesta.Campi di filtro api di riposo a molla nella risposta

mio oggetto User:

private class UserResource { 
    private String userLastName; 
    private String userFirstName; 
    private String email; 
    private String streetAddress; 
} 

E.g. URL: curl -i http://hostname:port/api/v1/users?fields=firstName,lastName. 

In questo caso ho bisogno di tornare solo i campi che si trovano in "campi" Richiesta di param. L'output JSON dovrebbe contenere solo firstName, lastName.

Esistono diversi modi per filtrare i campi in Jackson in base all'oggetto. Nel mio caso ho bisogno di filtrare dinamicamente passando l'elenco dei campi al serializzatore di Jackson.

Si prega di condividere alcune idee.

risposta

1

Utilizzare un ResponseBodyAdvice per modificare la risposta prima che venisse scritta nella risposta HTTP. Nel metodo beforeBodyWrite(...) si ha accesso all'attuale ServerHttpRequest che è possibile leggere il valore fields. Il tuo consiglio corpo sarà simile seguente:

@ControllerAdvice 
public class MyResponseBodyAdvisor implements ResponseBodyAdvice<UserResource> { 
    @Override 
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { 
     return returnType.getParameterType().equals(UserResource.class); 
    } 

    @Override 
    public UserResource beforeBodyWrite(UserResource body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { 
     String fields = ((ServletServerHttpRequest) request).getServletRequest().getParameter("fields"); 
     // body.set...(null) for each field not in fields 

     return body; 
    } 
} 
+0

Ciao Ali, Nella tua soluzione, stiamo rendendo i campi vuoti. Ma non voglio affatto mostrare il campo. Ho implementato come descritto in SPR-12586. Grazie. – Raj

+0

Annota il tuo dto con '@ JsonInclude' per rimuovere i campi' empty' dalla risposta –

0

Risulta questo è supportato in primavera 4.2 secondo https://jira.spring.io/browse/SPR-12586 via Jackson JsonFilter (anche se il jira restituisce un errore al momento).

+0

Ciao Ben, grazie per la risposta. È stato molto utile – Raj

+0

Ecco la mia soluzione. MappingJacksonValue mappingJacksonValue = new MappingJacksonValue (MyObject); Nel tuo controller devi solo mappareJacksonValue. assicurati che MyObject abbia l'annotazione @JsonFilter ("myObject"). – Raj

3

Grazie Ali. È un grande aiuto. Lascia che io lo realizzi oggi. Pubblicherò il risultato

@JsonFilter("blah.my.UserEntity") 
public class UserEntity implements Serializable { 
//fields goes here 
} 

@RequestMapping(value = "/users", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public MappingJacksonValue getUsers(@RequestParam MultiValueMap<String, String> params) { 
//Build pageable here 
Page<UserEntity> users = userService.findAll(pageable); 

    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(users); 
    FilterProvider filters = new SimpleFilterProvider() 
       .addFilter("blah.my.UserEntity", SimpleBeanPropertyFilter 
         .filterOutAllExcept("userFirstName")); 
    mappingJacksonValue.setFilters(filters); 
    return mappingJacksonValue; 
} 
+0

Questo è molto utile per me –

Problemi correlati