Suppose I have this very simple Book model that I want to validate that its title is not blank.
public class Book {
@NotBlank
public String title;
}
On the service layer I perform validation like this (using the Hibernate validator quarkus-hibernate-validator):
public class BookService {
public void validateBook(@Valid Book book) {
// your business logic here
}
}
My resource is:
@Path("/books")
public class BookResource {
@Inject
BookService bookService;
@Path("/service-method-validation")
@POST
public String tryServiceMethodValidation(Book book) {
try {
bookService.validateBook(book);
return "Book is valid! It was validated by service method validation.";
} catch (ConstraintViolationException e) {
return "Book invalid";
}
}
@Path("/private-method-validation")
@POST
public String tryMethodValidation(MessedTitleBook book) {
try {
Book book = translate_title(book);
method(book);
return "Book is valid! It was validated by method validation.";
} catch (ConstraintViolationException e) {
return "Book invalid";
}
}
private void method(@Valid Book book) {
// your method logic here
}
}
When I post a Book on the /service-method-validation everything works as expected and my book gets checked by the service method for violations.
Now suppose I have a second endpoint (/method-validation) which receives another object, MessedTitleBook, (think of it as book that has the author embedded on the title as well) on which I need to perform a translation to remove the author and then pass that book to a private method to perform some actions. In the private method I need to check that the translated book is valid but the @Valid annotation doesn't seem to work on private methods.
Question:
- Does
@Validwork on private methods? If not, please provide me a resource to study. - Is there a way to achieve validation automatically without having to do manual validation, i.e. inject
validatorand performvalidator.validate(book)?
EDIT
I forgot to mention that changing the method scope from private to public makes the validation work.