Spring Boot 자체 유효성 검사 제약 조건 오류 메시지를 반환하는 방법
내 요청에 문제가 있고 사용하려고 할 때 나만의 오류 대응 본문이 필요합니다.@NotEmpty
오류 메시지를 반환하는 제약 메시지 속성,
필요한 본문을 사용하여 오류 메시지를 반환하는 클래스입니다.
package c.m.nanicolina.exceptions;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.context.request.WebRequest;
@ControllerAdvice
public class CustomResponseEntityExceptionHandler {
@ExceptionHandler(value = {MissingServletRequestParameterException.class})
public ResponseEntity<ApiError> handleConflict(MissingServletRequestParameterException ex, WebRequest request) {
ApiError apiError = new ApiError(ex.getMessage(), ex.getMessage(), 1000);
return new ResponseEntity<ApiError>(apiError, null, HttpStatus.BAD_REQUEST);
}
}
이와 함께.CustomResponseEntityExceptionHandler
유효성 검사 오류가 발생할 경우 내 응답 본문을 반환할 수 있습니다.
제가 지금 시도하고 있는 것은 검증 제약 조건에서 메시지를 얻는 것입니다.
이 컨트롤러는 다음과 같은 기능합니다.NotEmpty
제약 조건:
package c.m.nanicolina.controllers;
import c.m.nanicolina.models.Product;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotEmpty;
@RestController
public class MinimumStockController {
@RequestMapping(value = "/minimumstock")
public Product product(
@RequestParam(value = "product.sku") @NotEmpty(message = "Product.sku cannot be empty") String sku,
@RequestParam(value = "stock.branch.id") String branchID) {
return null;
}
}
예외적으로 해당 메시지를 받아 오류 응답에 표시할 방법을 찾을 수 없습니다.
수업도 확인했습니다.MissingServletRequestParameterException
그리고 거기에 방법이 있습니다.getMessage
기본 메시지를 반환합니다.
네, 할 수 있고 스프링이 아주 잘 받쳐줍니다.봄에 활성화할 수 있는 일부 구성이 누락되었습니다.
- 스프링 사용
@Validated
스프링이 컨트롤러의 유효성을 검사할 수 있도록 하는 주석- 핸들
ConstraintViolationException
당신의ControllerAdvice
실패한 모든 유효성 검사 메시지를 수신합니다.- 마크.
required=false
에@RequestParam
Missing ServletRequestParameter를 던지지 않습니다.예외를 제외하고 제약 조건 유효성 검사의 다음 단계로 이동합니다.
@ControllerAdvice
public class CustomResponseEntityExceptionHandler {
@ExceptionHandler
public ResponseEntity<ApiError> handle(ConstraintViolationException exception) {
//you will get all javax failed validation, can be more than one
//so you can return the set of error messages or just the first message
String errorMessage = new ArrayList<>(exception.getConstraintViolations()).get(0).getMessage();
ApiError apiError = new ApiError(errorMessage, errorMessage, 1000);
return new ResponseEntity<ApiError>(apiError, null, HttpStatus.BAD_REQUEST);
}
}
@RestController
@Validated
public class MinimumStockController {
@RequestMapping(value = "/minimumstock")
public Product product(
@RequestParam(value = "product.sku", required=false) @NotEmpty(message = "Product.sku cannot be empty") String sku,
@RequestParam(value = "stock.branch.id", required=false) String branchID) {
return null;
}
}
참고: MissingServletRequestParameterException
요청 수명 주기에서 제약 조건 유효성 검사가 발생하기 전에 javax 유효성 검사 메시지에 액세스할 수 없습니다.
네, 가능합니다.수행할 작업:
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ArgumentsErrorResponseDTO> handleMethodArgumentNotValid(MethodArgumentNotValidException ex) {
ServiceException exception = ServiceException.wrap(ex, ErrorCode.FIELD_VALIDATION);
BindingResult results = ex.getBindingResult();
for (FieldError e: results.getFieldErrors()) {
exception.addLog(e.getDefaultMessage(), e.getField());
}
// log details in log
log.error("Invalid arguments exception: {}", exception.logWithDetails(), exception);
return ResponseEntity.status(exception.getErrorCode().getHttpStatus())
.body(ArgumentsErrorResponseDTO.builder()
.code(exception.getErrorCode().getCode())
.message(exception.getMessage())
.details(exception.getProperties())
.build());
}
이것이 도움이 된다면, 저는 이 문제에 대한 해결책을 여기서 찾았습니다: https://howtodoinjava.com/spring-boot2/spring-rest-request-validation/
이 메서드를 사용자 지정 응답 엔티티에 추가해야 합니다.예외 처리기 클래스:
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
List<String> details = new ArrayList<>();
for(ObjectError error : ex.getBindingResult().getAllErrors()) {
details.add(error.getDefaultMessage());
}
ErrorMessage error = new ErrorMessage(new Date(), details.toString());
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
당신은 이것을 당신의 핸들러에게 씌워야 합니다.
@ControllerAdvice
public class CustomResponseEntityExceptionHandler {
@ExceptionHandler(value = { MissingServletRequestParameterException.class })
public ResponseEntity<ApiError> handleConflict(MissingServletRequestParameterException ex, WebRequest request) {
String message = ex.getParameterName() + " cannot be empty";
ApiError apiError = new ApiError(ex.getMessage(), message, 1000);
return new ResponseEntity < ApiError > (apiError, null, HttpStatus.BAD_REQUEST);
}
}
갱신하다
기본 메시지를 어떻게 받을 수 있는지는 모르겠지만, 해결 방법으로 컨트롤러에서 검증을 수행하고 매개 변수가 비어 있으면 사용자 지정 예외를 적용한 후 다음에서 처리할 수 있습니다.CustomResponseEntityExceptionHandler
.
다음과 같은 것이 있습니다.
세트required=false
@RequestMapping(value = "/minimumstock")
public Product product(@RequestParam(required = false) String sku, @RequestParam(value = "stock.branch.id") String branchID) {
if (StringUtils.isEmpty(sku))
throw YourException("Product.sku cannot be empty");
return null;
}
@ExceptionHandler 사용(MethodArgumentNotValidException.class)
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<Object> validationHandler(MethodArgumentNotValidException exception) {
HashMap<String, Object> resObj = new HashMap<String, Object>();
String errorMsg = "validation is failed!";
if (exception.getErrorCount() > 0) {
List <String> errorDetails = new ArrayList<>();
for (ObjectError error : exception.getBindingResult().getAllErrors()) {
errorDetails.add(error.getDefaultMessage());
}
if (errorDetails.size() > 0) errorMsg = errorDetails.get(0);
}
resObj.put("status", GlobalConst.BAD_REQUEST_CODE);
resObj.put("message", errorMsg);
return new ResponseEntity<>(resObj, HttpStatus.OK);
}
언급URL : https://stackoverflow.com/questions/51331679/spring-boot-how-to-return-my-own-validation-constraint-error-messages
'programing' 카테고리의 다른 글
중첩된 if 문장에서 mysql IF 문 오류 (0) | 2023.09.04 |
---|---|
요소 내의 열 파손을 방지하는 방법은 무엇입니까? (0) | 2023.09.04 |
Getting a lot of Mariadb log-error message with WSREP: cleanup transaction for LOCAL_STATE (0) | 2023.09.04 |
SQL Plus를 tnsnames.ora와 연결하는 방법 (0) | 2023.09.04 |
노드 Js 서버의 터미널에서 demon 명령이 인식되지 않습니다. (0) | 2023.09.04 |