“object='user'的验证失败”错误计数:1”而不是“电子邮件不能为空”

slsn1g29  于 2021-07-06  发布在  Java
关注(0)|答案(3)|浏览(338)

我有一个验证和创建用户的api。当我没有在我收到的请求正文中键入电子邮件时

{
    "timestamp": "2020-11-26T13:55:40.116+00:00",
    "status": 400,
    "error": "Bad Request",
    "message": "Validation failed for object='user'. Error count: 1",
    "path": "/api/users"
}

我想改变信息更容易理解的错误,如“电子邮件必须不为空”。我的模型属性就是这样的:

@NotNull
private String email;

下面是我的控制器的方法:

@PostMapping("/users")
public ResponseEntity<User> addUser(@RequestBody @Valid User user) {
    User savedUser = manager.save(user);
    URI uri = ServletUriComponentsBuilder.fromCurrentRequest()
            .path("/{id}")
            .buildAndExpand(savedUser.getId())
            .toUri();
    return ResponseEntity.ok(savedUser);
}

我已尝试在中设置自定义消息 @NotNull 注解,但消息不会更改。当抛出错误时,控制台也会显示以下消息:

2020-11-26 15:09:11.460  WARN 7137 --- [nio-8080-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<pl.vemu.socialApp.entities.User> pl.vemu.socialApp.controllers.UserController.addUser(pl.vemu.socialApp.entities.User) throws pl.vemu.socialApp.exceptions.user.UserWithEmailAlreadyExistException: [Field error in object 'user' on field 'email': rejected value [xsars.pl]; codes [Email.user.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.email,email]; arguments []; default message [email],[Ljavax.validation.constraints.Pattern$Flag;@2a50b33,.*]; default message [must be a well-formed email address]] ]

如何在响应json中设置消息?
如何在控制台中删除此消息?其他错误不会在控制台中显示消息。

ccrfmcuu

ccrfmcuu1#

问题是spring在绑定时默认不发送错误。要启用它,您必须添加 server.error.include-binding-errors=always 在application.properties中。

fhg3lkii

fhg3lkii2#

而不是依靠 "message" 属性,您可以使用 "defaultMessage" 财产。
您可以在上设置自定义错误消息 @NotNull 注解。

@NotNull(message = "Name cannot be null")
private String name;

@NotNull(message = "email cannot be null")
@NotEmpty(message = "email cannot be empty")
private String email;

如果字段验证失败, spring 将设置这些自定义消息 "defaultMessage" 财产
正如您在评论中所说,您无法找到defaultmessage,另一种方法(可能是脏方法)是手动创建响应主体,您可以参考以下示例代码来构建它:

@PostMapping("saveEmployee")
public ResponseEntity<?> eat(@RequestBody @Valid Employee employee, Errors errors) {
    if (errors.hasFieldErrors()) {
        FieldError fieldError = errors.getFieldError();
        return ResponseEntity.status(HttpStatus.BAD_REQUEST)
                .body(fieldError.getDefaultMessage());
    }
    return ResponseEntity.ok(employee);
}
``` `FieldError#getDefaultMessage()` 会暴露出 `message` 中的属性 `@NotNull(message = "email can't be null")` 
kxe2p93d

kxe2p93d3#

ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body("email must be not null");

更换 HttpStatus.UNPROCESSABLE_ENTITY 使用适当的错误代码。

相关问题