容器容器的自动实体验证

问题描述

我需要在接收 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;
    
}

}

然后,在我的 EJB 中,我有接收交易列表的方法

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 (将#修改为@)