Сегодня я пытаюсь реализовать валидатор с использованием jax rs, я знаком только с spring mvc, используя spring-starter-валидатор и валидатор гибернации, в котором ошибки привязываются к результату привязки с помощью @RestController. Так что, пока я работал, я сделал так, чтобы это решение работало.
- создайте пользовательский глобальный сопоставитель для исключения 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(); } }
- Затем создайте запрос полезной нагрузки для вашего 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;
}
- Обратите внимание на
@Сравниваемые датыЯ создал образец валидатора аннотаций для проверки дат.
@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 ответов на исключение неправильного запроса.
Оригинал: “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”