2014-08-29 18 views
10

Ho un'entità (usando lombok) con qualche annotazione annotata @JsonView.@JsonView non filtro proprietà (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; 
} 

C'è un metodo di controllo annotato con annotazione @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); 
} 

Mi aspettavo che quell'input conterrà solo i campi annotati con @JsonView. Ma io pieno di campi.

Sto cercando di eseguire il debug delle sorgenti di primavera e jackson. In com.fasterxml.jackson.databind.SerializationConfig Vedo che la vista attiva è la mia classe JsonViews.OrderAdvancedSearch.class Ma in com.fasterxml.jackson.databind.ser.std.BeanSerializerBase variabile filteredProps ha sempre tutte le proprietà della mia entità.

+1

Hai trovato una risposta a questo? Sto avendo lo stesso problema con Spring 4.1 RC2 e Jackson 2.3.2. Quando utilizzo direttamente ObjectMapper, posso far funzionare le annotazioni @JsonView ma non automaticamente tramite Spring. – Christopher

risposta

2

Cercare di ottimizzare il vostro oggetto mapper Jackson:

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

Riferimento: Feature: JSON Views

2

risposta di @Attila T è sufficiente ma ho postato il codice per il modo di modificare voi l'oggetto mapper e usarlo ovunque

codice

controller:

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

oggetto personalizzato Mapper

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

Dispatcher Configuration (cambia di conseguenza per la configurazione basato su 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); 

     } 
Problemi correlati