@JsonView 不过滤属性(Spring 4.1.0.RC2,Jackson 2.3.2)
Posted
技术标签:
【中文标题】@JsonView 不过滤属性(Spring 4.1.0.RC2,Jackson 2.3.2)【英文标题】:@JsonView not filtering properties (Spring 4.1.0.RC2, Jackson 2.3.2) 【发布时间】:2014-10-23 03:57:52 【问题描述】:我有一个带有 @JsonView 注释的实体(使用 lombok)。
@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 总是具有我实体的所有属性。
【问题讨论】:
您找到答案了吗?我对 Spring 4.1 RC2 和 Jackson 2.3.2 有同样的问题。当我直接使用 ObjectMapper 时,我可以让 @JsonView 注释工作,但不能通过 Spring 自动工作。 【参考方案1】:@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);
【讨论】:
【参考方案2】:尝试调整您的 Jackson 对象映射器:
// disable this feature so that attributes with no view definition
// do not get serialized / deserialized
mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
参考:Feature: JSON Views
【讨论】:
以上是关于@JsonView 不过滤属性(Spring 4.1.0.RC2,Jackson 2.3.2)的主要内容,如果未能解决你的问题,请参考以下文章