将 Json 映射到响应和异常的通用模型
Mapping Json with general model for response and exceptions
提前抱歉我的英语不好:/
我想用 json 中的通用模型构建从 RestController 到任何对象的响应,如下所示:
元:{"status":httpstatus},
数据:{"response":响应}
例外情况:
元:{"status":httpstatus,"errorCode":"code","message":"message"},
数据:{}
有 "HttpMessageConverter" 和 Objectmapper 但我不知道如何在我的案例中使用它
objectmapper 使用来自 jackson 的 "serializer",但对于一个对象 ?
Spring 4.1.3
编辑:
像这样:
@RestController
@RequestMapping("..")
public class XXX {
@RequestMapping("..,consume/produce Json")
public ResponseEntity<T> method(@RequestBody arg)
T objectToReturn = ... ;
return new ResponseEntity<T>(objectToReturn, HttpStatus.CREATED);
}
...
}
对于您的简单情况,您可以使用 Jackson 2,在序列化 java class.
时忽略空字段
您的控制器可能如下所示
public ResponseEntity<ResponseStatus> method(@RequestBody @Valid arg,BindingResult result){
ResponseEntity<ResponseStatus> response = null;
if(result.hasErrors()){
Meta meta = new Meta(HttpStatus.BAD_REQUEST);
ResponseStatus body = new ResponseStatus(meta,null);
response = ResponseEntity.badRequest().body(body);
}else{
Meta meta = new Meta(HttpStatus.CREATED);
Data data = service.data(arg);
response = ResponseEntity.created(new URI("location"))
.body(new ResponseStatus(meta,data));
}
return response;
}
其他 class 将是
//Ignore Null Fields on the Class
@JsonInclude(Include.NON_NULL)
class ResponseStatus{
@Getter @Setter Meta meta;
@Getter @Setter Data data;
public ResponseStatus(Meta meta, data){
this.meta = meta;
this.data = data;
}
}
//Ignore Null Fields on the Class
@JsonInclude(Include.NON_NULL)
class Meta{
@Getter @Setter int status;
@Getter @Setter String errorCode;
@Getter Setter message;
public Meta(HttpStatus httpStatus){
status = httpStatus.value();
message = httpStatus.getReasonPhrase();
errorCode ="You code specific here";
}
}
提前抱歉我的英语不好:/
我想用 json 中的通用模型构建从 RestController 到任何对象的响应,如下所示:
元:{"status":httpstatus}, 数据:{"response":响应}
例外情况:
元:{"status":httpstatus,"errorCode":"code","message":"message"}, 数据:{}
有 "HttpMessageConverter" 和 Objectmapper 但我不知道如何在我的案例中使用它 objectmapper 使用来自 jackson 的 "serializer",但对于一个对象 ?
Spring 4.1.3
编辑:
像这样:
@RestController
@RequestMapping("..")
public class XXX {
@RequestMapping("..,consume/produce Json")
public ResponseEntity<T> method(@RequestBody arg)
T objectToReturn = ... ;
return new ResponseEntity<T>(objectToReturn, HttpStatus.CREATED);
}
...
}
对于您的简单情况,您可以使用 Jackson 2,在序列化 java class.
时忽略空字段您的控制器可能如下所示
public ResponseEntity<ResponseStatus> method(@RequestBody @Valid arg,BindingResult result){
ResponseEntity<ResponseStatus> response = null;
if(result.hasErrors()){
Meta meta = new Meta(HttpStatus.BAD_REQUEST);
ResponseStatus body = new ResponseStatus(meta,null);
response = ResponseEntity.badRequest().body(body);
}else{
Meta meta = new Meta(HttpStatus.CREATED);
Data data = service.data(arg);
response = ResponseEntity.created(new URI("location"))
.body(new ResponseStatus(meta,data));
}
return response;
}
其他 class 将是
//Ignore Null Fields on the Class
@JsonInclude(Include.NON_NULL)
class ResponseStatus{
@Getter @Setter Meta meta;
@Getter @Setter Data data;
public ResponseStatus(Meta meta, data){
this.meta = meta;
this.data = data;
}
}
//Ignore Null Fields on the Class
@JsonInclude(Include.NON_NULL)
class Meta{
@Getter @Setter int status;
@Getter @Setter String errorCode;
@Getter Setter message;
public Meta(HttpStatus httpStatus){
status = httpStatus.value();
message = httpStatus.getReasonPhrase();
errorCode ="You code specific here";
}
}