2014-08-29 27 views
10

我有一個實體(使用lombok)和一些帶註釋的@JsonView註解。@JsonView不過濾屬性(Spring 4.1.0.RC2,Jackson 2.3.2)

@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註釋的字段。 但我已經充滿了田野。

我試圖調試春天和傑克遜的來源。 在com.fasterxml.jackson.databind.SerializationConfig我看到活動視圖是我的類JsonViews.OrderAdvancedSearch.class 但在com.fasterxml.jackson.databind.ser.std.BeanSerializerBase變量filteredProps始終具有我的實體的所有屬性。

+1

你找到一個答案?我與Spring 4.1 RC2和Jackson 2.3.2有同樣的問題。當我直接使用ObjectMapper時,我可以使@JsonView註釋工作,但不能通過Spring自動實現。 – Christopher 2014-09-08 19:26:17

回答

2

嘗試調整你的傑克遜對象映射:

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

參考:Feature: JSON Views

2

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

     }