@Допустимая аннотация не работает в простом проекте

#java #maven #validation #console

#java #maven #проверка #консоль

Вопрос:

Вот мой простой демонстрационный код Java:

 package com.demo;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

public class App {
    public static void main(String[] args) {
       @Valid @NotNull Object x = null;
       System.out.println("Shouldn't print this!");
    }
}
  

И это моя конфигурация Maven:

 <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>untitled1</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
    </dependencies>
</project>
  

Вывод:

 Shouldn't print this!
  

Ожидаемое поведение — выдача исключения с ошибкой проверки.

Почему этот простой код работает не так, как ожидалось?

Комментарии:

1. Аннотации сами по себе ничего не делают. Для каждой аннотации требуется какой-то процессор для обработки аннотаций (вы можете рассматривать аннотации как подсказки). Здесь вам нужен процессор проверки, чтобы заставить его работать. Взгляните на baeldung.com/javax-validation

Ответ №1:

В качестве зависимости у вас есть api проверки bean, вы могли бы использовать подобную реализацию hibernate-validator , которая транзитивно извлекает api проверки.

В среде Java SE вам также понадобится реализация EL.

 <dependency>
   <groupId>org.glassfish</groupId>
   <artifactId>javax.el</artifactId>
   <version></version>
</dependency>
  

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

 public class ValidationExample {
    
        @NotNull
        private Object name;
    
        public static void main(String[] args) {
            ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
            Validator validator = factory.getValidator();
            Set<ConstraintViolation<ValidationExample>> violations = validator.validate(new ValidationExample());
    
            for (ConstraintViolation<ValidationExample> violation : violations) {
                System.out.println(violation.getMessage());
            }
        }
    }
  

Должно дать:

 INFO: HV000001: Hibernate Validator 6.1.6.Final
must not be null
  

Подробнее здесь: средство проверки гибернации