programing

Spring Boot 자체 유효성 검사 제약 조건 오류 메시지를 반환하는 방법

lastmoon 2023. 9. 4. 20:32
반응형

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@RequestParamMissing 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;
}

enter image description here

enter image description here

@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

반응형