Spring

"개체 = '사용자'에 대한 유효성 검사에 실패했습니다. 오류 수: 1" 대신 "이메일은 null이 아니어야 합니다"

기록만이살길 2022. 11. 6. 13:39
반응형

"개체 = '사용자'에 대한 유효성 검사에 실패했습니다. 오류 수: 1" 대신 "이메일은 null이 아니어야 합니다" 물어보다

1. 질문(문제점):

사용자를 확인하고 생성하는 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"
}

"이메일은 null이 아니어야 합니다"와 같은 보다 이해하기 쉬운 오류로 메시지를 변경하고 싶습니다. 내 모델의 속성은 다음과 같습니다.

@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에서 메시지를 설정하는 방법은 무엇입니까?
콘솔에서 이 메시지를 제거하는 방법은 무엇입니까? 다른 오류는 콘솔에 메시지를 표시하지 않습니다.

2. 해결방안:

속성 에 의존하는 대신 "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를 찾을 수 없다는 어노테이션에서 말했듯이 다른 접근 방식(아마도 더러운 접근 방식)은 Response body을 수동으로 생성하는 것이므로 다음 샘플 코드를 참조하여 빌드할 수 있습니다.

@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")

65023750
반응형