【问题标题】:EntityManager not injected into Jboss ModuleEntityManager 未注入 Jboss 模块
【发布时间】:2015-09-14 23:14:55
【问题描述】:

我正在使用 jboss wildfly 9。 我有一个提供程序作为模块部署到:

wildfly > modules > com > mycompany > myprovider

文件夹。 然后我在我的数据库中有一个带有DAO模式写入和读取的jpa项目。 我想使用 JTA 处理 DAO 事务,但为了使 DAO 类对 myprovider 可见,我还需要将 DAO JPA 项目放在模块目录中。

现在面临真正的问题:似乎我无法使用 @PersistenceContext 注释将实体管理注入到我的 EntityManager 变量中:

@PersistenceContext(unitName = "KAS-Mapping") 
private EntityManager entityManager;

这是我的 persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="KAS-Mapping">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
            <class>my.class.persistence.model.MapGroup</class>
            <class>my.class.persistence.model.MapUser</class>
            <properties>
                <property name="javax.persistence.provider" value="org.hibernate.ejb.HibernatePersistence" />
                <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
                <property name="javax.persistence.provider" value="org.hibernate.jpa.HibernatePersistenceProvider"/>
                <property name="javax.persistence.transactionType" value="JTA"/>
                <property name="javax.persistence.jtaDataSource" value="java:jboss/datasources/MyDS"/>

        </properties>
    </persistence-unit>
</persistence> 

为什么我不能将上下文注入到 jar 模块中? 我怎么了?

【问题讨论】:

    标签: wildfly entitymanager persistence.xml


    【解决方案1】:

    WildFly/JBoss 模块不是 Java EE 概念,因此期望资源注入、持久性上下文或 CDI bean 跨模块边界工作是不合理的。

    您是否尝试过 meta-inf="import" 对您的模块依赖项?见https://docs.jboss.org/author/display/WFLY9/Class+Loading+in+WildFly

    【讨论】:

      【解决方案2】:

      为什么您的提供者依赖于您的 DAO 层?这是一个糟糕的模式,你应该真正避免。现在您是否也将您的 persistence.xml 放入您的模块中?

      您是否尝试过使用标准的 persistence.xml 标记而不是属性?

      <persistence-unit name="KAS-Mapping" transaction-type="JTA">
          <jta-data-source>jboss/datasources/MyDS</jta-data-source>
          <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
      
          <class>my.class.persistence.model.MapGroup</class>
          <class>my.class.persistence.model.MapUser</class>
          <properties>
              <property name="javax.persistence.provider" value="org.hibernate.ejb.HibernatePersistence" />
              <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
          </properties>
      </persistence-unit>
      

      【讨论】:

      • 为什么你认为这是一个糟糕的模式?我需要与其他应用程序/应用程序层一起访问数据库。为所有人复制同一个 dao 不应该没用吗?
      • 我想我需要更多地了解您的提供商的工作。但是,提供者不应该依赖于 dao,如果有任何依赖关系,它应该是 provider
      • 它是一个密钥斗篷提供者,它是身份验证所必需的。 Dao 用于将 keycloak 属性文件与我自己的用户数据库同步。约束是 keycloak spi 可以作为 jboss 中的一个模块部署,因此它被视为一个 jboss 模块,即一个具有自己隔离范围的独立 jar。有人告诉我 jboss 模块对应用服务器上下文不感兴趣,所以不可能进行注入
      • 你的persistence.xml在哪里?在 DAO 模块中?您可以在 DAO 中拥有类,但在您的个人 web 应用程序中拥有 persistence.xml。只要您的 jboss-deployment-structure.xml 依赖于您的模块,类路径就可用。
      • 我应该澄清对模块 def 的关注:我的意思不是战争 webapp...而是部署到独立/模块/my/package/myappname/main 中的 jar ...两个 dao 提供程序都已部署这种方式作为 keycloak 参考指南指定
      猜你喜欢
      • 2012-03-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2015-05-02
      • 2011-11-07
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多