2016-07-19 23 views
0

Ich muss einige Attribute nur in einem Controller filtern.Wie wird mit JsonFilter im Frühjahr Regler zugeordnet gefiltert?

Fasterxml JsonFilter funktioniert, wenn ich es mit ObjectMapper in der Steuerung verwendet als

FilterProvider filter2 = new SimpleFilterProvider().addFilter("somefilter", 
SimpleBeanPropertyFilter.filterOutAllExcept("prop1","prop2")); 

Mit Objekt folgen wie

@JsonFilter("somefilter") 
public class Bar{ 
String prop1; 
String prop2; 
String prop3; 
} 

Aber wenn man versucht, das gleiche Objekt mit Feder Controller zurückzukehren

@RequestMapping(value = "/path", method = RequestMethod.GET) 
    protected @ResponseBody Foo handleGet(.. 

wo

public class Foo{ 
Bar p1; 
Bar p2; 
} 

Das Attribut Bar wird komplett weggelassen. In diesem Fall müssen wir das Objekt ungefiltert zurückgeben.

Ich muss den Objekt-Mapper in der Steuerung verwenden, um das gesamte Objekt zurückzugeben.

Gibt es eine Möglichkeit, den Filter für den Controller zu deaktivieren?

+0

Sie meinen, Sie versuchen, einige Felder auf Ihrem Bar-Objekt zu serialisieren zu überspringen? –

+0

Ja, überspringen Sie die Serialisierung, wenn ObjectMapper verwendet wird. Aber serialisieren Sie alles in der Steuerung. –

+0

Und wenn der Controller es verwendet, möchten Sie die Felder anzeigen? Entschuldigung, ich kann meinen vorherigen Kommentar nicht bearbeiten. –

Antwort

1

Sie können MappingJacksonValue versuchen, den Jackson-Filteranbieter so einzustellen, dass der POJO mit dem Spring-Controller serialisiert wird.

Aus dem Quellcode AbstractJackson2HttpMessageConverter:

protected void writeInternal(Object object, Type type, HttpOutputMessage outputMessage) 
     throws IOException, HttpMessageNotWritableException { 
    ... 
    try { 
     ... 
     if (object instanceof MappingJacksonValue) { 
      MappingJacksonValue container = (MappingJacksonValue) object; 
      ... 
      filters = container.getFilters(); 
     } 
     ... 
     ObjectWriter objectWriter; 
     if (serializationView != null) { 
      objectWriter = this.objectMapper.writerWithView(serializationView); 
     } 
     else if (filters != null) { 
      objectWriter = this.objectMapper.writer(filters); 
     } 
     else { 
      objectWriter = this.objectMapper.writer(); 
     } 
     ... 
     objectWriter.writeValue(generator, value); 
     ... 
    } 

Es sollte möglich sein, die FilterProvider in objectMapper durch Filter in MappingJacksonValue auf zurückgesetzt. In Ihrem Fall können Sie versuchen, etwas wie folgt:

@RequestMapping(value = "/foo", method = RequestMethod.GET) 
protected @ResponseBody MappingJacksonValue handleGet(...) { 
    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(foo);  
    FilterProvider filter = new SimpleFilterProvider().addFilter("somefilter", SimpleBeanPropertyFilter.serializeAllExcept()); 
    mappingJacksonValue.setFilters(filter); 
    return mappingJacksonValue; 
} 

Wenn Sie nur einen Controller haben erfordern Eigenschaften zum Ausfiltern von Bar, können Sie auch Filter für die jeweiligen Controller hinzuzufügen, können Sie erwägen, anstatt sie in die ObjectMapper Einstellung :

@RequestMapping(value = "/bar", method = RequestMethod.GET) 
protected @ResponseBody MappingJacksonValue handleGet(...) { 
    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(bar);  
    FilterProvider filter = new SimpleFilterProvider().addFilter("somefilter", SimpleBeanPropertyFilter.filterOutAllExcept("prop1","prop2")); 
    mappingJacksonValue.setFilters(filter); 
    return mappingJacksonValue; 
}