Java Spring MVC+;Jackson-JsonView
我需要从我的模型中公开两组不同的值,所以我实现了两个视图Java Spring MVC+;Jackson-JsonView,java,json,spring,Java,Json,Spring,我需要从我的模型中公开两组不同的值,所以我实现了两个视图 public class Views { public static class Small{ } public static class Large extends Small { } } 然后,在我的模型中,我将(所有其他字段都用JSONIgnore注释) @JsonView(Views.Small.class) @Id @GeneratedValue(strategy = IDENTITY)
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=“/spots”,method=RequestMethod.GET)
公共响应getSpotStatus(@RequestParam(value=“idPosto”)intidposto,
@RequestParam(value=“occulated”)布尔值已占用){
Posto Posto=postoService.findByIdPosto(idPosto);
ObjectMapper mapper=新的ObjectMapper();
禁用(MapperFeature.DEFAULT\u VIEW\u INCLUSION);
mapper.setConfig(mapper.getSerializationConfig()
.withView(视图.小型.类));
convertValue(posto,JsonNode.class);
返回新的响应状态(posto,HttpStatus.OK);
及
@RequestMapping(value=“/spot”,method=RequestMethod.GET)
公共响应性getSpotList(@RequestParam(value=“idPiano”)int idPiano){
Piano Piano=pianoService.findById(idPiano);
List posti=postoService.showSpotsByFloor(-1,钢琴);
ObjectMapper mapper=新的ObjectMapper();
禁用(MapperFeature.DEFAULT\u VIEW\u INCLUSION);
mapper.setConfig(mapper.getSerializationConfig()
.withView(视图.大型.类));
convertValue(posti,JsonNode.class);
返回新的响应状态(POSI,HttpStatus.OK);
}
Che结果是相同的…(显然第一个是一个Posto,第二个是一个列表,但是模型中的所有字段都是序列化的…)
使用视图时我做错了什么?您需要使用@ResponseBody使用agree view和annotation定义产品和消费 示例:更改所需的
@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);
}
@products(value={MediaType.APPLICATION\u JSON\u value})
@使用(值={MediaType.APPLICATION\u JSON\u value})
public@responseBy public ResponseEntity getSpotList(。。。
//请求时,将您的客户同意请求视图
受保护的HttpEntity标头()
{
最终HttpHeaders=新HttpHeaders();
headers.set(“Accept”,MediaType.APPLICATION\u JSON\u VALUE);
headers.set(“application”,MediaType.application\u JSON\u VALUE);
//我不能在这里定义你的类型
返回新的HttpEntity(标头);
}
您需要使用@ResponseBody使用agree view和annotation定义产品和消费
示例:更改所需的
@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);
}
@products(value={MediaType.APPLICATION\u JSON\u value})
@使用(值={MediaType.APPLICATION\u JSON\u value})
public@responseBy public ResponseEntity getSpotList(。。。
//请求时,将您的客户同意请求视图
受保护的HttpEntity标头()
{
最终HttpHeaders=新HttpHeaders();
headers.set(“Accept”,MediaType.APPLICATION\u JSON\u VALUE);
headers.set(“application”,MediaType.application\u JSON\u VALUE);
//我不能在这里定义你的类型
返回新的HttpEntity(标头);
}
您的问题是,当ApplicationContext
启动时,Spring实例化了自己的JacksonObjectMapper
您必须自动连接Spring托管的ObjectMapper
并配置该实例,而不是使用new
创建自己的实例
private final ObjectMapper mapper;
public MyController(ObjectMapper mapper) {
this.mapper = mapper;
}
您的问题是,当
ApplicationContext
启动时,Spring实例化了自己的JacksonObjectMapper
您必须自动连接Spring托管的ObjectMapper
并配置该实例,而不是使用new
创建自己的实例
private final ObjectMapper mapper;
public MyController(ObjectMapper mapper) {
this.mapper = mapper;
}