Рубрики
Без рубрики

Пошаговая процедура о том, как реализовать пользовательский javax.validator с использованием Джерси и Jax-rs в приложении Spring boot

Сегодня я пытаюсь реализовать валидатор с использованием jax rs, я знаком только с spring mvc с использованием spring-… Помечено явой, весной, джерси, Джаксом rs.

Сегодня я пытаюсь реализовать валидатор с использованием jax rs, я знаком только с spring mvc, используя spring-starter-валидатор и валидатор гибернации, в котором ошибки привязываются к результату привязки с помощью @RestController. Так что, пока я работал, я сделал так, чтобы это решение работало.

  1. создайте пользовательский глобальный сопоставитель для исключения ConstraintViolationException.
public class ConstraintValidatorExceptionMapper implements ExceptionMapper{

    @Override
    public Response toResponse(ConstraintViolationException exception) {
        final Map errorResponse =
                exception.getConstraintViolations()
                  .stream()
                  .collect(Collectors.toMap(o -> o.getPropertyPath().toString(), o -> o.getMessage()));

        return Response
                 .status(Response.Status.BAD_REQUEST)
                 .entity(errorResponse)
                 .build();
    }

}
  1. Затем создайте запрос полезной нагрузки для вашего 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;
}
  1. Обратите внимание на @Сравниваемые даты Я создал образец валидатора аннотаций для проверки дат.
@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[] payload() default {};

}
  1. Далее для нашей конечной точки нам нужно добавить @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);
    }
  1. Затем зарегистрируйте свой пользовательский валидатор в файле конфигурации вашего джерси.
@Component
public class JerseyConfig extends ResourceConfig {

  @Value("${spring.jersey.application-path}")
  private String basePath;

  public JerseyConfig() {
    register(ConstraintValidatorExceptionMapper.class);
  }
}

Вот и все! Образец ответа в postman должен быть примерно таким:

Таким образом, мы можем предоставить клиенту, в каких полях есть ошибки, вместо того, чтобы просто полагаться на 400 ответов на исключение неправильного запроса.

Оригинал: “https://dev.to/logronj/step-by-step-procedure-on-how-to-implement-custom-like-javax-validator-using-jersey-and-jax-rs-in-springboot-application-3m45”