问题描述
我需要在接收 List 时使用自定义约束验证 JPA 实体事务)。 然后我创建一个约束注释
@Target({ ElementType.TYPE,ElementType.TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { TransactionValidator.class})
public @interface TransactionValid {
String message() default "{org.hibernate.validator.referenceguide.chapter06.classlevel." +
"ValidPassengerCount.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
LoadValues type() default LoadValues.MOV;
@interface List {
TransactionValid[] value();
}
}
并引用验证器:
public class TransactionValidator implements ConstraintValidator<TransactionValid,Transaction>{
@Override
public void initialize(TransactionValid constraintAnnotation) {
//throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isValid(Transaction t,ConstraintValidatorContext context) {
try {
ValidatorObject<Transaction> validator=new TransactionValidatorLogic();
validator.validate(t);
}
catch (ConstraintViolations ex) {
for (String s :ex.getViolations())
context.buildConstraintViolationWithTemplate(s).addConstraintViolation();
return false;
}
return true;
}
}
public void loadTransactions(List<@TransactionValid Transaction> q,final DataInfo info) throws HBException {
// some other stufs
try{
for (Transaction t : q){
em.persist(t);
}
}
catch (Exception e){
if (e instanceof ConstraintViolationException){
}
....
}
现在我希望在我的自定义验证器上得到一个断点,但它接缝没有进行验证。
这是一个带有 EJB 和 WEB 模块的 EAR 项目。 在我使用的 EJB pom 中:
<dependency>
<groupId>jakarta.platform</groupId>
<artifactId>jakarta.jakartaee-api</artifactId>
<version>9.0.0</version>
<scope>provided</scope>
</dependency>
我的persistence.xml是:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="3.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_3_0.xsd">
<persistence-unit name="HB_PU" transaction-type="JTA">
<!--provider>org.eclipse.persistence.jpa.PersistenceProvider</provider-->
<validation-mode>AUTO</validation-mode>
<jta-data-source>jdbc/hb_ds_admin</jta-data-source>
<! -- some class listed -->
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<!--
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.id.new_generator_mappings" value="false"/>
-->
<properties>
<property name="eclipselink.target-database" value="MysqL"/>
</properties>
</persistence-unit>
</persistence>
如您所见,我添加了该属性,尽管它不需要声明 Jakarta Persistence Specification 3.0 。规范声明默认情况下设置了 AUTO 值,并且验证 Bootstrap 将在 Container 中完成
无论如何我在调试中没有看到任何验证,任何断点都在验证器上停止!
我也尝试使用 EclipseLink 作为提供程序,结果相同: org.eclipse.persistence.jpa.PersistenceProvider
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)