Джакарта пространство имен
В рамках передачи от Oracle к Eclipse Foundation, Java EE переименовывается в Jakarta EE. В Jakarta EE 9 имена пакетов Java были изменены с javax.*
на jakarta.*
.
Ответ М. Джастина верен в отношении Джакарты. Я добавил этот ответ, чтобы предоставить больше объяснений и конкретных примеров.
Интерфейс против реализации
Jakarta Bean Validation — это спецификация API на Java. Бинарная библиотека для этой спецификации содержит только интерфейсы, а не исполняемый код. Поэтому нам также нужна реализация этих интерфейсов.
Я знаю только одну реализацию спецификаций Jakarta Bean Validation версий 2 и 3: Hibernate. Валидатор версий 6 и 7 (соответственно).
Настольные и консольные приложения
Для веб-приложений веб-контейнер, совместимый с Jakarta, предоставит как интерфейс, так и реализацию, необходимые для выполнения проверки компонентов.
Для настольных и консольных приложений у нас нет такого веб-контейнера, совместимого с Jakarta. Таким образом, вы должны связать с вашим приложением интерфейс jar и реализацию jar.
Вы можете использовать инструмент управления зависимостями, такой как Maven, < a href="https://en.wikipedia.org/wiki/Gradle" rel="nofollow noreferrer">Gradle или Ivy, чтобы загрузить и связать JAR-файлы интерфейса и реализации.
Джакартский язык выражений
Чтобы запустить Jakarta Bean Validation, нам нужен еще один инструмент Jakarta: Jakarta Expression Language, специальный язык программирования для внедрение и оценка выражений. Jakarta Expression Language также известен как EL.
Jakarta Expression Language определяется Jakarta EE как спецификация, для которой вы должны загрузить jar интерфейсов. И вам также нужно получить реализацию этих интерфейсов в другом банке.
У вас может быть выбор реализации. По состоянию на 2021-03 год я знаю о Eclipse Glassfish от Eclipse Foundation, предоставляющей реализацию в виде отдельной библиотеки, которую мы можем скачать бесплатно. Могут быть и другие реализации, такие как Open Liberty от IBM Corporation. Присмотритесь к реализации, которая соответствует вашим потребностям.
Зависимости Maven POM
Собрав всю эту информацию вместе, вам понадобятся четыре JAR-файла: пара JAR-файлов интерфейса и реализации для каждого из двух проектов: Jakarta Bean Validation и Jakarta Expression Language.
- Jakarta Bean Validation
- Jakarta Expression Language
Ниже приведены четыре зависимости, которые необходимо добавить в файл Maven POM, если Maven является вашим предпочтительным инструментом.
Как упоминалось выше, вы можете найти другую реализацию EL, чтобы заменить библиотеку Glassfish, которую я использую здесь.
<!--********| Jakarta Bean Validation |********-->
<!-- Interface -->
<!-- https://mvnrepository.com/artifact/jakarta.validation/jakarta.validation-api -->
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Implementation -->
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>7.0.1.Final</version>
</dependency>
<!-- Jakarta Expression Language -->
<!-- Interface -->
<!-- https://mvnrepository.com/artifact/jakarta.el/jakarta.el-api -->
<dependency>
<groupId>jakarta.el</groupId>
<artifactId>jakarta.el-api</artifactId>
<version>4.0.0</version>
</dependency>
<!-- Implementation -->
<!-- https://mvnrepository.com/artifact/org.glassfish/jakarta.el -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>jakarta.el</artifactId>
<version>4.0.1</version>
</dependency>
Это должно устранить ошибку javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'
.
Пример использования
Вы можете протестировать свою установку с помощью следующего простого класса Car
. У нас есть проверки для каждого из трех полей-членов.
package work.basil.example.beanval;
import jakarta.validation.constraints.*;
public class Car
{
// ---------------| Member fields |----------------------------
@NotNull
private String manufacturer;
@NotNull
@Size ( min = 2, max = 14 )
private String licensePlate;
@Min ( 2 )
private int seatCount;
// ---------------| Constructors |----------------------------
public Car ( String manufacturer , String licensePlate , int seatCount )
{
this.manufacturer = manufacturer;
this.licensePlate = licensePlate;
this.seatCount = seatCount;
}
// ---------------| Object overrides |----------------------------
@Override
public String toString ( )
{
return "Car{ " +
"manufacturer='" + manufacturer + '\'' +
" | licensePlate='" + licensePlate + '\'' +
" | seatCount=" + seatCount +
" }";
}
}
Или, если вы используете Java 16 и более поздние версии, вместо этого используйте более краткое record
.
package work.basil.example.beanval;
import jakarta.validation.constraints.*;
public record Car (
@NotNull
String manufacturer ,
@NotNull
@Size ( min = 2, max = 14 )
String licensePlate ,
@Min ( 2 )
int seatCount
)
{
}
Запустите проверку. Сначала мы запускаем успешно настроенный объект Car
. Затем мы создаем экземпляр второго объекта Car
, который неисправен, нарушая одно ограничение в каждом из трех полей.
package work.basil.example.beanval;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.Validation;
import jakarta.validation.Validator;
import jakarta.validation.ValidatorFactory;
import java.util.Set;
public class App
{
public static void main ( String[] args )
{
App app = new App();
app.demo();
}
private void demo ( )
{
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// No violations.
{
Car car = new Car( "Honda" , "ABC-789" , 4 );
System.out.println( "car = " + car );
Set < ConstraintViolation < Car > > violations = validator.validate( car );
System.out.format( "INFO - Found %d violations.\n" , violations.size() );
}
// 3 violations.
{
Car car = new Car( null , "X" , 1 );
System.out.println( "car = " + car );
Set < ConstraintViolation < Car > > violations = validator.validate( car );
System.out.format( "INFO - Found %d violations.\n" , violations.size() );
violations.forEach( carConstraintViolation -> System.out.println( carConstraintViolation.getMessage() ) );
}
}
}
Когда бег.
car = Car{ manufacturer='Honda' | licensePlate='ABC-789' | seatCount=4 }
INFO - Found 0 violations.
car = Car{ manufacturer='null' | licensePlate='X' | seatCount=1 }
INFO - Found 3 violations.
must be greater than or equal to 2
must not be null
size must be between 2 and 14
person
Basil Bourque
schedule
08.03.2021
5.2.4.Final
решило проблему для меня. - person fracz   schedule 21.03.20165.2.4.Final
, и исключение все еще существует. - person Alfonso Nishikawa   schedule 18.05.2016