Не работает валидатор, т.е. при попытки записи в поле класса setTitle(title)
, где title = null
он даже не вызывается (см. логи ниже). Целый день сижу, уже всё прогуглил, нет ничего даже похожего на решение.
P.S.: Да, я знаю что есть уже готовый валидатор, но хочу на таком "простом" примере попробывать написать свой.
Использую:
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
Что бы проверять валидность в 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;
}
Ну а затем всё вроде стало понятно :)
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Очень прошу человека с большим опытом ответить мне на вопросСовсем запутался с Enterprise составляющей Java
Проблема такова: почему у меня запись пустого значения? Код для записи в память рабочийПроверял
есть переменая а которая припустим не должна быть больше 5-тиЧисло n рандомно будет подбираться в диапазоне 0 - 5
Всем приветИспользую лаунчер HTA, он запускает консоль по нажатию определенной кнопки, , как сделать так, чтобы при открытии консоли выводился...