Spring MVC + Jackson - JsonView

问题描述 投票:1回答:2

我需要从我的模型中公开两组不同的值,所以我实现了2个视图

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

在我的控制器上我有两种方法:

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

Che结果是一样的......(显然第一个是单个Posto,第二个是List,但模型中的所有字段都是序列化的....

使用视图时我做错了什么?

java json spring
2个回答
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);
}

0
投票

你的问题是,当ObjectMapper开始时,Spring实例化了自己的Jackson ApplicationContext

您必须自动装配Spring管理的ObjectMapper并配置该实例,而不是使用new创建自己的实例。

private final ObjectMapper mapper;

public MyController(ObjectMapper mapper) {
    this.mapper = mapper;
}
© www.soinside.com 2019 - 2024. All rights reserved.