2016-07-19 3 views
0

Мне нужно отфильтровать некоторый атрибут только в одном контроллере.Как включить отфильтрованный фильтр с помощью JsonFilter в контроллере весны?

Fasterxml JsonFilter работает, когда я использовал его с ObjectMapper в контроллере, как следовать

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

С объекта как

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

Но при попытке вернуть тот же объект с пружинным регулятором

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

, где

public class Foo{ 
Bar p1; 
Bar p2; 
} 

Атрибут Bar полностью опущен. В этом случае нам нужно вернуть объект нефильтрованным.

Мне нужно использовать объект mapper в контроллере, чтобы вернуть весь объект.

Есть ли способ отключить фильтр для контроллера?

+0

Вы имеете в виду, что вы пытаетесь пропустить некоторые поля на объекте Bar для сериализации? –

+0

Да, пропустите сериализацию при использовании ObjectMapper. Но сериализуйте все в контроллере. –

+0

И когда контроллер использует его, вы хотите отображать поля? Извините, я не могу изменить свой предыдущий комментарий. –

ответ

1

Вы можете попробовать MappingJacksonValue, чтобы установить поставщика фильтров Jackson для сериализации POJO с помощью контроллера Spring.

Из исходного кода 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); 
     ... 
    } 

Должна быть предусмотрена возможность сброса FilterProvider в objectMapper с помощью фильтров, установленных в MappingJacksonValue. В вашем случае, вы можете попробовать что-то вроде следующим образом:

@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; 
} 

Если у вас есть только один контроллер требует, чтобы отфильтровать свойства от Bar, вы можете также рассмотреть, чтобы добавить фильтр для конкретного контроллера вместо установки его в ObjectMapper :

@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; 
} 
Смежные вопросы