代码之家  ›  专栏  ›  技术社区  ›  Zaw Than oo

如何配置以在Jboss 7中使用EntityListeners?

  •  0
  • Zaw Than oo  · 技术社区  · 11 年前

    我已经添加了 org.eclipse.persistence 中的模块 JBoss 7 。我无法使用 EntityListeners .
    如果我删除 @EntityListeners(IDInterceptor.class) 从实体,持久化操作正常。
    在实体持久化之前,我必须执行一些操作。

    如果我使用 Junit , 实体监听器 是工作。

    我使用: JBoss 7 , Spring 3.5 JPA 2.0 (EcliplseLink 2.5.0)

    让我知道,我如何使用 实体监听器 在我的web应用程序中 JBoss 7 ?

    绝缘类型.java

    @Entity
    @TableGenerator(name = "INSUTYPE_GEN", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", pkColumnValue = "INSUTYPE_GEN", allocationSize = 10)
    @EntityListeners(IDInterceptor.class)
    public class InsuType implements Serializable {
        @Id
        @GeneratedValue(strategy = GenerationType.TABLE, generator = "INSUTYPE_GEN")
        private String id;
        private String name;
        //getter and setter
    }
    

    IDInterceptor.java

    public class IDInterceptor {
        @PrePersist
        public void onPrePersist(Object obj) {
    
        }
    
        //other function
    }
    

    InsuTypeDAO.java

    @Repository("InsuTypeDAO")
    public class InsuTypeDAO implements IInsuTypeDAO {
        @PersistenceContext
        protected EntityManager em;
    
        @Transactional(propagation = Propagation.REQUIRED)
        public InsuType insert(InsuType insuType) throws DAOException {
            em.persist(insuType);
            return insuType;
        }
    }   
    

    如果我使用 @EntityListeners(IDInterceptor.class) ,我得到以下错误

        at org.eclipse.persistence.internal.jpa.EntityManagerImpl.persist(EntityManagerImpl.java:496) [eclipselink-2.5.0.jar:2.5.0.v20130507-3faac2b]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_23]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_23]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_23]
        at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_23]
        at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240) [spring-orm.jar:3.1.
    1.RELEASE]
        at $Proxy57.persist(Unknown Source) at org.ace.insurance.system.common.insutype.persistence.InsuTypeDAO.insert(InsuTypeDAO.java:33) [classes:]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_23]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_23]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_23]
        at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_23]
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) [spring-aop.jar:3.1.1.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) [spring-aop.jar:3.1.1.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) [spring-aop.jar:3.1.1.RELEASE]
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) [spring-tx.jar:3.1.1.RELEASE]
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) [spring-aop.jar:3.1.1.RELEASE]
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) [spring-aop.jar:3.1.1.RELEASE]
        at $Proxy108.insert(Unknown Source) at org.ace.insurance.system.common.insutype.service.InsuTypeService.addNewInsuType(InsuTypeService.java:33) [classes:]
        at org.ace.insurance.web.manage.system.ManageInsuTypeActionBean.addNewInsuType(ManageInsuTypeActionBean.java:52) [classes:]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_23]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_23]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_23]
        at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_23]
        at org.apache.el.parser.AstValue.invoke(AstValue.java:262) [jbossweb-7.0.13.Final.jar:]
        at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278) [jbossweb-7.0.13.Final.jar:]
        at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
        at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) [weld-core-1.1.5.AS71.Final.jar:2012-02-10 15:31]
        at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) [jsf-impl-2.1.7-jbossorg-2.jar:]
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) [jboss-jsf-api_2.1_spec-2.0.5.Final.jar:2.0.
    5.Final]
        ... 33 more
    Caused by: java.lang.ClassNotFoundException: javax.enterprise.inject.spi.BeanManager from [Module "org.eclipse.persistence:main" from local module loader @4c5e1
    76f (roots: D:\java\JBoss-7.1.1\modules)]
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
        at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
        at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
    
    1 回复  |  直到 11 年前
        1
  •  0
  •   Zaw Than oo    11 年前

    最后,我得到了一个解决方案 EntityListener 类必须扩展 DescriptorEventAdapter . 即使是 实体侦听器 需要注入弹簧组件,只需尝试如下。 确保使用 static 属性和 setter property 对于弹簧组件/bean。

    @Component
    public class IDInterceptor extends DescriptorEventAdapter {
        private static SomeSpringBean someSpringBean;
    
        @Autowired(required = true)
        @Qualifier("SomeSpringBean")
        public void setSomeSpringBean(SomeSpringBean bean) {
            someSpringBean = bean;
        }   
    
        @Override
        public void preInsert(DescriptorEvent event) {
    
        }
    }