我必须使用Spring编写一个Rest控制器。
@PostMapping(value = "/mycontroller", produces = "application/json")
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public MyDTOOuptup myMethod(@Valid @RequestBody MyDTO input) {
... body ...
}
我写了一个DTO输入对象,它表示我的控制器的请求主体。在将请求分析到控制器之前,我在DTO中添加了一些验证规则来验证输入。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyDTO {
@NotNull(message="my custom error message for field_a")
@JsonProperty("field_A")
private String fieldA;
@NotNull(message="my custom error message for field_b")
@JsonProperty("field_B")
private String fieldB;
}
它运行良好。如果输入错误,我会收到400-错误的请求和适当的错误描述到响应体中。
但是,我发现这个json主体太冗长了。
{
"timestamp": "2020-03-31T14:29:42.401+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"NotNull.myDTO.field_a",
"NotNull.field_a",
"NotNull.java.lang.String",
"NotNull"
],
"arguments": [
{
"codes": [
"myDTO.field_a",
"field_a"
],
"arguments": null,
"defaultMessage": "field_a",
"code": "field_a"
}
],
"defaultMessage": "my custom error message for field_a",
"objectName": "myDTO",
"field": "productId",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotNull"
}
],
"message": "Validation failed for object='myDTO'. Error count: 1",
"path": "/mycontroller"
}
我如何指定我只需要错误描述消息或类似的消息?有智能/纤薄的结构吗?
您可以定义自己的自定义异常并添加异常处理程序
class ExceptionResponse {
private boolean success = false;
private String errorCode;
private String errorMessage;
private String exception;
private List<String> errors;
private String path;
private String timestamp = LocalDateTime.now().toString();
}
异常处理程序,
@ControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ExceptionResponse> invalidInput(MethodArgumentNotValidException ex, HttpServletRequest request) {
ExceptionResponse response = getExceptionResponse(); //generate exception response
return ResponseEntity.badRequest().contentType(MediaType.APPLICATION_JSON_UTF8).body(response);
}
}
我希望它能有所帮助!!
这些属性在DefaultErrorAttributes
作为Map<String, Object>
可用。
ErrorAttributes的默认实现。在可能的情况下提供以下属性:。。。
如果你想修改errors
,你必须首先获得带有属性的映射,然后修改并最终返回。属性是使用DefaultErrorAttributes::getErrorAttributes
方法获得的。使用Map::remove
,从地图中删除相当简单。
这是应该工作的代码。返回的bean应该是ErrorAttributes
。
@Bean
public ErrorAttributes errorAttributes() {
return new DefaultErrorAttributes() {
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, includeStackTrace);
errorAttributes.remove("errors");
return errorAttributes;
}
};
}