È possibile determinare in modo selettivo quando viene utilizzata l'annotazione @JsonFilter in fase di runtime?@JsonFilter genera "JsonMappingException: Impossibile risolvere BeanPropertyFilter"
Ricevo un'eccezione JsonMappingException (vedere di seguito) quando non si fornisce il filtro.
Background:
ho imparato da un recent StackOverflow post che posso usare @JsonFilter per filtrare in modo dinamico le proprietà del bean ottenere serializzato. Funziona alla grande Dopo aver aggiunto @JsonFilter("apiFilter")
per la mia classe di dominio e con l'aggiunta di questo codice nel mio servizio JAX-RS (usando l'implementazione CXF), sono in grado di filtrare in modo dinamico le proprietà restituite dal mio RESTful API:
// shortened for brevity
FilterProvider filters = new SimpleFilterProvider().addFilter("apiFilter", SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));
return mapper.filteredWriter(filters).writeValueAsString(user);
Il problema ci sono diverse chiamate di servizio in cui non voglio affatto applicare il filtro. In questi casi, voglio restituire l'intera classe del dominio senza filtrare alcuna proprietà. Nel caso in cui cerco solo di restituire la classe di dominio sto ottenendo un'eccezione come segue:
Caused by: org.codehaus.jackson.map.JsonMappingException: Can not resolve BeanPropertyFilter with id 'apiFilter'; no FilterProvider configured
at org.codehaus.jackson.map.ser.BeanSerializer.findFilter(BeanSerializer.java:252)
at org.codehaus.jackson.map.ser.BeanSerializer.serializeFieldsFiltered(BeanSerializer.java:216)
at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:140)
nell'esempio modificato, dovrei includere il codice per verificare quale metodo di scrittura chiamare in ogni chiamata di servizio jax-rs? in alcuni metodi di servizio restituisco un oggetto Utente reale anziché una stringa. molte grazie per il tuo contributo! – Justin
ok, ho avuto la possibilità di fare un tentativo. il "trucco" che hai suggerito funziona, ma non sono riuscito a far funzionare il tuo secondo suggerimento "più pulito". in quel caso ricevo ancora l'errore "no FilterProvider configurato". grazie ancora. – Justin
@Justin: beh, IMO una soluzione "non pulita" che risolve un problema è meglio di una "pulita" che non funziona :). Spero che abbia aiutato a risolvere il tuo problema. –