@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 filtersProps всегда есть все свойства моей сущности.
Ответы
Ответ 1
Попробуйте настроить ваш картограф объекта Jackson:
// disable this feature so that attributes with no view definition
// do not get serialized / deserialized
mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
Ссылка: Функция: JSON Views
Ответ 2
@Ответ Attila T достаточен, но я разместил код для того, как настроить ваш объект mapper и использовать его везде
Код контроллера:
@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);
}