@JsonView не фильтрует свойства (Spring 4.1.0.RC2, Jackson 2.3.2)

У меня есть объект (использующий ломбок) с некоторой аннотированной аннотацией @JsonView.

@Entity
@Table(name = "`order`")
@Getter
@Setter
@ToString
@Description("Приказ")
public class Order extends Auditable {


    private static final long serialVersionUID = -1299630493411381582L;

    @JsonView(JsonViews.OrderAdvancedSearch.class)
    @ManyToOne
    private School school;

    @Column(length = 50)
    private String number;
}

Существует метод контроллера, аннотированный аннотацией @JsonView.

@Secured(value = {"ROLE_AUTHENTICATED_USER"})
@RequestMapping(value = "/order", method = RequestMethod.GET, headers = {"Content-Type=application/json"})
@JsonView(JsonViews.OrderAdvancedSearch.class)
@ResponseBody
public ResponseEntity<Order> getOrder(HttpServletRequest request) throws IOException, DnevnikException, RestException {
    Order order = orderRepository.findOne(292L); // just for example
    return new ResponseEntity<>(order,HttpStatus.OK);
}

Я ожидал, что ввод будет содержать только поля, аннотированные @JsonView. Но у меня полно полей.

Я пытаюсь отлаживать источники spring и jackson. В com.fasterxml.jackson.databind.SerializationConfig я вижу, что активное представление — это мой класс JsonViews.OrderAdvancedSearch.class. Но в com.fasterxml.jackson.databind.ser.std.BeanSerializerBase переменная filteredProps всегда имеет все свойства моего объекта.


person Pavel Varchenko    schedule 29.08.2014    source источник
comment
Вы нашли ответ на это? У меня такая же проблема с Spring 4.1 RC2 и Jackson 2.3.2. Когда я использую ObjectMapper напрямую, я могу заставить работать аннотации @JsonView, но не автоматически через Spring.   -  person Christopher    schedule 08.09.2014


Ответы (2)


Попробуйте настроить ваш сопоставитель объектов Джексона:

// disable this feature so that attributes with no view definition
// do not get serialized / deserialized
mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);

Ссылка: Функция: представления JSON

person Attila T    schedule 14.10.2014

Ответа @Attila T достаточно, но я разместил код о том, как настроить ваш объектный преобразователь и использовать его везде.

Код контроллера:

@Autowired
JSONMapper objectMapper;

@RequestMapping
public ResponseEntity<> getSchoolDetails(ParameterMapper mapper,HttpServletResponse           response) throws JsonGenerationException, JsonMappingException, IOException
{
     Order order =  orderRepository.findOne(292L);
    ObjectWriter w = objectMapper.writerWithView(SomeClass.class);
    objectWriter.writeValue(response.getWriter(),order);
  return new ResponseEntity<>(order,HttpStatus.OK);
}

Пользовательский сопоставитель объектов

@Component
public class JSONMapper extends ObjectMapper {


public JSONMapper() {

    Hibernate4Module hm = new Hibernate4Module();
    registerModule(hm);
    configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
    configure(SerializationFeature.INDENT_OUTPUT , false);
    configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
    setSerializationInclusion(Include.NON_EMPTY);  
}
}

Конфигурация диспетчера (измените соответственно для конфигурации на основе xml)

   @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

            MappingJackson2HttpMessageConverter jsonConvertor = new MappingJackson2HttpMessageConverter(new JSONMapper());
            List<MediaType> jsonMediaTypes =new ArrayList<MediaType>();
            jsonMediaTypes.add(MediaType.APPLICATION_JSON);
            jsonConvertor.setSupportedMediaTypes(jsonMediaTypes);
            converters.add(jsonConvertor);    
            addDefaultHttpMessageConverters(converters);

       }
person Pushpendra Jaiswal    schedule 28.01.2015