@Slf4j
@RestController
@RequestMapping("/api/user")
public class UserApiController {
@PostMapping("")
public Api<UserRegisterRequest> register(
@Valid
@RequestBody
Api<UserRegisterRequest> userRegisterRequest
){
log.info("init: {}", userRegisterRequest);
var body = userRegisterRequest.getData();
return Api.<UserRegisterRequest>builder()
.resultCode(String.valueOf(HttpStatus.OK.value()))
.resultMessage(HttpStatus.OK.getReasonPhrase())
.data(body)
.build();
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRegisterRequest {
//@NotNull //null이면 안됨.
//@NotEmpty //null이면 안되고,Empty(공백)도 안됨.
//@NotBlank //null도 안되고, 공백도 안되고, 공백이 포함돼도 안됨.
private String name;
private String nickName;
@Size(min = 1, max = 12)
@NotBlank
private String password;
@NotNull
@Min(1)
@Max(100)
private Integer age;
@Email
private String email;
@PhoneNumber
private String phonenumber;
@FutureOrPresent
private LocalDateTime registerAt;
@AssertTrue(message = "name or nickname 은 존재해야 합니다.")
public boolean isNameCheck(){
if(Objects.nonNull((name)) && !name.isBlank()){
return true;
}
if(Objects.nonNull((nickName)) && !nickName.isBlank()){
return true;
}
return false;
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class Api<T> {
private String resultCode;
private String resultMessage;
@Valid
private T data;
private Error error;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Error{
private List<String> errorMessage;
}
}
클라이언트에게도 해당 에러에 대한 정보를 표시할 수 있도록 model 클래스를 하나 만들어준다.
data에 대한 validation도 검증을 해주어야 한다. data에 실질적인 값이 들어가기 때문에
@Slf4j
@RestControllerAdvice
public class ValidationExceptinHandler {
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public ResponseEntity<Api> ValidationException(
MethodArgumentNotValidException exception
){
log.error("", exception);
var errorMessageList = exception.getFieldErrors().stream()
.map(it->{
var format = "%s : { %s } 은 %s";
var message = String.format(format, it.getField(), it.getRejectedValue(), it.getDefaultMessage());
return message;
}).collect(Collectors.toList());
var error = Api.Error
.builder()
.errorMessage(errorMessageList)
.build();
var errorResponse = Api
.builder()
.resultCode(String.valueOf(HttpStatus.BAD_REQUEST.value()))
.resultMessage(HttpStatus.BAD_REQUEST.getReasonPhrase())
.error(error)
.build();
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(errorResponse);
}
}