Hello!
I'm trying to use tomee-embedded for unit testing EJBs and some of those EJBs functions make use of hibernate-specific
validators, such as @ISBN. Running ISBNTest from the code below causes
jakarta.validation.UnexpectedTypeException: No compliant org.hibernate.validator.constraints.ISBN ConstraintValidator
found for annotated element of type java.lang.String
As I understand, validation is being performed by apache bval, which is integral part of tomee-embedded, and bval lacks
@ISBN validator. Is there any way to override validator implementation inside tomee-embedded instance to use hibernate
validator instead of bval?
Thanks in advance!
Sample code below:
pom.xml
<?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>test</groupId>
<artifactId>ISBNTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.tomee</groupId>
<artifactId>tomee-embedded</artifactId>
<version>9.1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>9.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>
</dependencies>
</project>
src/main/java/test/ISBNService.java:
package test;
import jakarta.ejb.Stateless;
import org.hibernate.validator.constraints.ISBN;
@Stateless
public class ISBNService {
public void process(@ISBN String isbn) {
// do nothing in particular
}
}
src/test/java/test/ISBNTest.java:
package test;
import jakarta.ejb.embeddable.EJBContainer;
import java.util.Properties;
import javax.naming.NamingException;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class ISBNTest {
private static EJBContainer container;
private ISBNService ISBNService;
@BeforeClass
public static void init() {
Properties properties = new Properties();
properties.setProperty(EJBContainer.PROVIDER, "tomee-embedded");
container = EJBContainer.createEJBContainer(properties);
}
@Before
public void inject() throws NamingException {
ISBNService = (ISBNService)
container.getContext().lookup("global/ISBNTest/ISBNService");
}
@Test
public void isbnTest() {
ISBNService.process("123");
}
}