2016-10-12 44 views
1

我需要从我的模型公开两个不同的设定值,使我实现了2次的Spring MVC + - 杰克逊JsonView

public class Views { 

    public static class Small{ } 

    public static class Large extends Small { } 

} 

然后,在我的模型,我把(所有其他字段都标注了JSONIgnore

@JsonView(Views.Small.class) 
    @Id 
    @GeneratedValue(strategy = IDENTITY) 
    @Column(name = "id_posto", unique = true, nullable = false) 
    public int getIdPosto() { 
     return this.idPosto; 
    } 

    public void setIdPosto(int idPosto) { 
     this.idPosto = idPosto; 
    } 

@JsonView(Views.Large.class) 
    @NotNull 
    @Column(name = "nome_posto_park") 
    public String getNomePosto() { 
     return this.nomePosto; 
    } 
public void setNomePosto(String nomePosto) { 
     this.nomePosto = nomePosto; 
    } 

在我的控制器我有2种方法:

@RequestMapping(value = "/spots", method = RequestMethod.GET) 
    public ResponseEntity<Posto> getSpotStatus(@RequestParam(value = "idPosto") int idPosto, 
      @RequestParam(value = "occupied") boolean occupied) { 
     Posto posto = postoService.findByIdPosto(idPosto); 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION); 
     mapper.setConfig(mapper.getSerializationConfig() 
       .withView(Views.Small.class)); 
     mapper.convertValue(posto, JsonNode.class); 

return new ResponseEntity<Posto>(posto, HttpStatus.OK); 

@RequestMapping(value="/spot", method = RequestMethod.GET) 
    public ResponseEntity<List<Posto>> getSpotList(@RequestParam (value = "idPiano") int idPiano){ 
     Piano piano = pianoService.findById(idPiano); 

    List<Posto> posti = postoService.showSpotsByFloor(-1, piano); 
    ObjectMapper mapper = new ObjectMapper(); 
     mapper.disable(MapperFeature.DEFAULT_VIEW_INCLUSION); 
     mapper.setConfig(mapper.getSerializationConfig() 
       .withView(Views.Large.class)); 
    mapper.convertValue(posti, JsonNode.class); 

    return new ResponseEntity<List<Posto>>(posti, HttpStatus.OK); 
} 

澈结果是一样的......(显然第一种是单一的Posto和第二清单,但所有来自模型的字段被序列....

我在做什么错何时使用视图?

回答

0

您需要定义生产和同意查看和批注与

@ResponseBody

例消耗:改变你的需要

@Produces(value = { MediaType.APPLICATION_JSON_VALUE }) 
@Consumes(value = { MediaType.APPLICATION_JSON_VALUE }) 
public @ResponseBody public ResponseEntity<List<Posto>> getSpotList(... 

//when request, put your client agree request view 
protected HttpEntity<T> headers() 
{ 
    final HttpHeaders headers = new HttpHeaders(); 
    headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); 
    headers.set("application", MediaType.APPLICATION_JSON_VALUE); 
    // T define your type here 
    return new HttpEntity<T>(headers); 
}