Dav*_*ave 1 java spring spring-mvc spring-restcontroller
我正在尝试使用 Spring 的两个验证@RequestParam,捕获@ControllerAdvice缺少参数时框架抛出的异常,并返回缺少参数的 400 错误。
所以,我的代码如下所示:
@RestController
@Validated
public class FooController {
@RequestMapping(value = "/foo", method = RequestMethod.GET)
@ResponseBody
public Foo getFoo(@RequestParam LocalDate dateFrom, @RequestParam LocalDate dateTo) {
// Do stuff
}
}
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = {MissingServletRequestParameterException.class})
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorResponse handleMissingParameterException(MissingServletRequestParameterException ex) {
return new ErrorResponse(ex.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我错过了一个参数,这将非常有效 - 我会得到一个很好的 JSON 响应,如下所示:
{
"reason": "Required LocalDate parameter 'dateFrom' is not present"
}
Run Code Online (Sandbox Code Playgroud)
状态为 400。
但是,如果我错过了这两个参数,我会得到与上面相同的错误响应 - 即它只报告第一个缺失的参数,如果我可以列出所有参数,我会更喜欢它。
看看异常的方法,它似乎只打算处理单个参数 - 它有方法getParameterName()和getParameterType()单数。
有什么方法可以让 Spring 在单个异常中报告所有验证错误,以改善客户端的体验?
小智 5
您可以设置@RequestParam(required = false)然后使用@NotNull。
如果参数是则将抛出nulla 。ConstraintViolationException要处理它只需声明一个@ExceptionHandler方法。检查下面的代码片段
@RestController
@Validated
public class FooController {
@RequestMapping(value = "/foo", method = RequestMethod.GET)
@ResponseBody
public Foo getFoo(
@RequestParam (required = false)
@NotNull(message = "Required LocalDate parameter dateFrom is not present")
LocalDate dateFrom,
@RequestParam (required = false)
@NotNull(message = "Required LocalDate parameter dateTo is not present")
LocalDate dateTo)
) {
// Do stuff
}
}
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler({ConstraintViolationException.class})
public ResponseEntity<List<ErrorResponseDTO>> exceptionHandler(ConstraintViolationException e) {
List<ErrorResponseDTO> errors = new ArrayList<>(e.getConstraintViolations().size());
e.getConstraintViolations().forEach(violation -> errors.add(new ErrorResponseDTO(violation.getMessage())));
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}
}
Run Code Online (Sandbox Code Playgroud)
结果会是这样的:
[
{
"reason": "Required LocalDate parameter dateFrom is not present"
},
{
"reason": "Required LocalDate parameter dateTo is not present"
}
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1870 次 |
| 最近记录: |