Springboot 애플리케이션에서 Jersey 및 Jax-rs를 사용하여 사용자 정의와 유사한 javax.validator를 구현하는 방법에 대한 단계별 절차

3240 단어 jerseyspringjaxrsjava
오늘 저는 jaxrs를 사용하여 유효성 검사기를 구현하려고 노력하고 있습니다. @restController를 사용하여 BindingResult에 오류가 바인딩되는 spring-starter-validator 및 hibernate-validator를 사용하는 springmvc에만 익숙합니다. 그래서 제가 작업하면서이 솔루션이 작동하도록 만들었습니다.
  • constraintViolationException에 대한 사용자 정의 전역 매퍼를 만듭니다.

  • public class ConstraintValidatorExceptionMapper implements ExceptionMapper<ConstraintViolationException>{
    
        @Override
        public Response toResponse(ConstraintViolationException exception) {
            final Map<String, String> errorResponse =
                    exception.getConstraintViolations()
                      .stream()
                      .collect(Collectors.toMap(o -> o.getPropertyPath().toString(), o -> o.getMessage()));
    
            return Response
                     .status(Response.Status.BAD_REQUEST)
                     .entity(errorResponse)
                     .build();
        }
    
    }
    


  • 다음으로 API에 대한 페이로드 요청을 생성합니다.

  • @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    @CompareDates
    public class ViewTransactionHistoryRequest {
    
        @JsonProperty
        private String customerId;
        @JsonProperty
        private String cardSerNo;
        @JsonProperty 
        @NotBlank(message="contact id must not be null or empty")
        private String contactId;
        @JsonProperty
        private String dateFrom;
        @JsonProperty
        private String dateTo;
        @JsonProperty 
        private Double amountFrom;
        @JsonProperty
        private Double amountTo;
        @JsonProperty
        private int page;
    }
    


  • @CompareDates 날짜를 확인하기 위해 샘플 주석 유효성 검사기를 만들었습니다.

  • @Constraint(validatedBy = DateValidator.class)
    @Target({ ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface CompareDates {
    
        String message() default "dateTo should not be less than dateFrom!";
    
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    
    }
    


  • 다음으로 엔드포인트에 대해 유효성 검사를 트리거하기 위해 @Valid를 추가해야 합니다.

  •     @POST
        @Path("/view-transaction")
        @Consumes("application/json")
        @ApiOperation(value = "Get transaction history")
        public Object fiterBy(@RequestBody @Valid ViewTransactionHistoryRequest request) {
            LOGGER.info("Get account contact transaction history"); 
            return accountContactService.viewTransactionHistory(request);
        }
    


  • 그런 다음 저지 구성 파일에 사용자 정의 유효성 검사기를 등록합니다.

  • @Component
    public class JerseyConfig extends ResourceConfig {
    
      @Value("${spring.jersey.application-path}")
      private String basePath;
    
      public JerseyConfig() {
        register(ConstraintValidatorExceptionMapper.class);
      }
    }
    


    그게 다야! Postman의 샘플 응답은 다음과 같아야 합니다.

    이러한 방식으로 400 잘못된 요청 예외 응답에 의존하는 대신 오류가 있는 필드를 클라이언트에 제공할 수 있습니다.

    좋은 웹페이지 즐겨찾기