Java EE 8. Не работает валидатор

212
21 июля 2018, 23:10

Не работает валидатор, т.е. при попытки записи в поле класса setTitle(title), где title = null он даже не вызывается (см. логи ниже). Целый день сижу, уже всё прогуглил, нет ничего даже похожего на решение.

P.S.: Да, я знаю что есть уже готовый валидатор, но хочу на таком "простом" примере попробывать написать свой.

Использую:

  • GlassFish 4
  • Java EE 8
  • Maven
  • IntelliJ IDEA

Book.java

package bookstore.items;
import bookstore.validators.NotNull;
public class Book {
    @NotNull
    private String title;
    private int cost;
    private String author;
    private String code;
    public Book(String title, int cost, String author) {
        setTitle(title);
        setCost(cost);
        setAuthor(author);
    }
    /* Геттеры и сеттеры */
}

NotNull.java

package bookstore.validators;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = NotNullValidator.class)
public @interface NotNull {
    String message() default "{javax.validation.constraints.NotNull}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

NotNullValidator.java

package bookstore.validators;
import org.apache.log4j.Logger;
import bookstore.interceptors.Loggable;
import javax.inject.Inject;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class NotNullValidator implements ConstraintValidator<NotNull, Object> {
    @Inject
    private Logger logger;
    @Loggable
    @Override
    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
        if (object != null) {
            logger.info("Validator value : true");
            return true;
        }
        logger.info("Validator value : false");
        return false;
    }
}

BookService.java

package bookstore.services;
import bookstore.interceptors.Loggable;
import bookstore.items.Book;
import bookstore.items.numbergenerator.NumberGenerator;
import bookstore.items.numbergenerator.annotations.Issn;
import javax.inject.Inject;
public class BookService {
    @Inject
    @Issn
    private NumberGenerator numberGenerator;
    @Loggable
    public Book addBook(String title, int cost, String author) {
        Book book = new Book(title, cost, author);
        book.setCode(numberGenerator.generateNumber());
        return book;
    }
}

AddBookServlet.java

public class AddBookServlet extends HttpServlet {
    @Inject
    private BookService bookService;
    @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ArrayList<Book> books = new ArrayList<>();
        books.add(bookService.addBook(null, 1, "TestAuthor1"));
        Writer writer = resp.getWriter();
        for (Book book : books) {
            writer.write(book.getTitle() + " " + book.getAuthor() + " " + book.getCost() + "\n");
        }
    }
}

Лог исполнения:

2018-06-17 16:39:16 INFO  Field:18 - Invoked: addBook
2018-06-17 16:39:16 INFO  Field:22 - Closed: addBook
Answer 1

Что бы проверять валидность в JavaEE необходимо вызывать метод validate, у Validator, предварительно создав его экземпляр через ValidatorFactory.

В моём случаем проблема решалась вот так:

Book.java

public class Book {
    @NotNull
    private String title;
    private int cost;
    @NotNull
    private String author;
    private String code;
    /* Геттеры и сеттеры */
}

BookService.java

public Book addBook(String title, int cost, String author) throws ConstraintViolationException {
    Book book = new Book();
    book.setTitle(null);
    book.setCost(123);
    book.setAuthor(null);
    book.setCode(numberGenerator.generateNumber());
    Set<ConstraintViolation<Book>> violations = validator.validate(book);
    if (violations != null) {
        throw new ConstraintViolationException(violations);
    }
    return book;
}

Ну а затем всё вроде стало понятно :)

READ ALSO
Spring || JEE7?

Spring || JEE7?

Очень прошу человека с большим опытом ответить мне на вопросСовсем запутался с Enterprise составляющей Java

242
Пустое значение в SharedPreferences Android

Пустое значение в SharedPreferences Android

Проблема такова: почему у меня запись пустого значения? Код для записи в память рабочийПроверял

251
Увеличивать число a на n раз, но чтобы оно не увеличилось больше заданого максимума

Увеличивать число a на n раз, но чтобы оно не увеличилось больше заданого максимума

есть переменая а которая припустим не должна быть больше 5-тиЧисло n рандомно будет подбираться в диапазоне 0 - 5

206
Вывод команды в консоль из лаунчера java script

Вывод команды в консоль из лаунчера java script

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

209