Как избежать конфликта с весенней проверкой, которая помещена в разные модули?

Допустим, я определил такой bean-компонент:

@Component
@Validated
public class MyComponent {
    public void someMethod(@NotNull Integer myIntValue) {
        System.out.println(myIntValue);
    }
}

Это упаковано в какой-то jar-файл, например: com.comppany:component:1.0.jar

Этот файл jar должен зависеть (включать?) От:

  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.1.0.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.13.Final</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator-annotation-processor</artifactId>
    <version>6.0.13.Final</version>
  </dependency>

Возникает вопрос: что, если этот файл jar добавлен как зависимость к другому проекту, в котором есть другая реализация проверки JSR-303 (например, валидатор Commons из apache)? Есть ли способ уберечься от такой ситуации? 1. Использовать одну проверку для "компонентного" модуля, а другую - для другого? 2. или может быть проверена во время компиляции (как?) Та цель, которая импортирует "компонентный" модуль, имеет такую ​​же проверку JSR-303?


person Cherry    schedule 13.02.2019    source источник
comment
возможно, может помочь исключение проверочной зависимости зависимостей, объявленных в pom.xml. В разделе Исключения зависимостей на странице руководств maven есть подробности о exclusions   -  person    schedule 13.02.2019


Ответы (1)


Я видел, как optional использовали для этого. Вы сможете создать библиотеку с помощью указанного вами валидатора Hibernate. Клиенты, использующие вашу библиотеку, либо явно укажут зависимость валидатора Hibernate, либо библиотеку валидатора, совместимую с JSR-303, по своему выбору.

Это предполагает, что в аннотации @Validated явно не упоминается пакет 'hibernate' в операторе import, а вместо этого используется API.

Это может привести к тому, что приложение не будет построено, если зависимость не указана, но это может быть нормально, так как клиент будет явно указывать выбор зависимости.

Этот ответ SO дает больше информации, а вот документация Maven.

Альтернатива - оставить то, что у вас есть, и если кто-то захочет использовать другую библиотеку, он исключит зависимость Hibernate из зависимости от этой библиотеки и добавит свою. Это хорошо, если клиент просто хочет, чтобы приложение работало, не думая о том, какую зависимость JSR-303 использовать.

Что вы выберете, зависит от того, как вы ожидаете, что люди будут использовать эту библиотеку.

person user944849    schedule 13.02.2019