我在一个Reactive SpringBoot应用程序中使用Spring Web MVC,并编写了一个自定义验证器。在验证错误的情况下,使用400响应代码,这很好,但是AbstractErrorWebExceptionHandler
捕获了这个并吐出
{
"timestamp": 1651678946524,
"path": "/signup",
"status": 400,
"error": "Bad Request",
"requestId": "0f61cb96-1"
}
对客户端不是很有用。如何显示错误信息和代码?我知道它们是可用的,因为它们被记录了:
DEBUG 32475 --- [ parallel-1] a.w.r.e.AbstractErrorWebExceptionHandler : [0f61cb96-1] Resolved [WebExchangeBindException: Validation failed for argument at index 0 in method: public reactor.core.publisher.Mono<...with 1 error(s): [Field error in object 'userSignup' on field 'username': rejected value [matilda0]; codes [username.exists.userSignup.username,username.exists.username,username.exists.java.lang.String,username.exists]; arguments []; default message [null]] ] for HTTP POST /signup
任何帮助都将不胜感激,谢谢。
我是这样做的:
private void validate(SomeEntity someEntity) {
Errors errors = new BeanPropertyBindingResult(someEntity, "SomeEntity");
validator.validate(someEntity, errors);
if (errors.hasErrors()) {
throw new ServerWebInputException(errors.toString());
}
}
验证器被注入:
private final Validator validator;
private final SomeEntityDao dao;
public SomeEntityHandler(
Validator validator,
SomeEntityDao dao
) {
this.validator = validator;
this.dao = dao;
}
项目:WebFluxR2dbc
添加
server.error.include-binding-errors=ALWAYS
应用程序。属性似乎解决了这个问题,尽管它仍然不能正确查找消息代码。要实际使错误消息本身出现在响应中,我必须在验证器中连接MessageSourceAccessor,并将其用作默认消息!
errors.rejectValue("username","username.exists",msgs.getMessage("username.exists"))
所以我一定还是遗漏了一些东西,但是现在可以工作了。