Java Websphere资源绑定

Java Websphere资源绑定,java,jakarta-ee,websphere,websphere-liberty,Java,Jakarta Ee,Websphere,Websphere Liberty,我们有一个项目,有相当多的依赖关系。我现在对Websphere资源绑定和资源定义感到困惑 ejb-jar.xml描述资源 persistence.xml描述数据库资源 我们可以有web.xml,在这里我们还描述了资源 我们可以使用ibm-web-bnd.xml,在这里我们可以对资源进行绑定 比如说,我有一个*.jar,它在persistence.xml(jta数据源)中定义了数据源,在ejb-jar.xml(enterprisebeans/session/resource ref)中定义了相同的

我们有一个项目,有相当多的依赖关系。我现在对Websphere资源绑定和资源定义感到困惑

  • ejb-jar.xml描述资源
  • persistence.xml描述数据库资源
  • 我们可以有web.xml,在这里我们还描述了资源
  • 我们可以使用ibm-web-bnd.xml,在这里我们可以对资源进行绑定 比如说,我有一个*.jar,它在persistence.xml(jta数据源)中定义了数据源,在ejb-jar.xml(enterprisebeans/session/resource ref)中定义了相同的数据源,并且还绑定了这个数据源ibm-web-bnd.xml(resource ref)

    现在我想在我的*.war中使用这个*.jar

    假设我已正确配置WebSphereLiberty服务器上的所有资源

    在应用程序启动期间,我发现这个*.jar有以下错误:

    Unable to use JDBC Connection to create Statement
    java.sql.SQLException: Unsupported use of GenericConnection.  A 
    GenericConnection is provided during application start when creating an 
    EntityManagerFactory for a persistence unit which has configured one of its 
    datasource to be in the component naming context; java:comp/env. During 
    application start, the component naming context will not exist, and the 
    correct datasource cannot be determined. When the persistence unit is used, 
    the proper datasource and connection will be obtained and used.
    
    问题:

  • 为什么我的*.jar看不到我在WebSphereLibery(在server.xml中)上定义的数据源?我是否错过了我的*.war中的一些绑定
  • 为什么我们要在web.xml中描述资源?我认为这是web应用程序的定义,比如servlet映射、过滤器等
  • 为什么persistence.xml和ejb-jar.xml中都描述了相同的数据源(persistence.xml还不够吗?)
  • 资源绑定会延迟依赖注入吗 无法修改*.jar中的代码,但必须在我的*.war中使用:

    ejbjar.xml

    ...
    <enterprise-beans>
    <session id="MyEntityManagerBean">
        <ejb-name>MyEntityManagerBean</ejb-name>
        <ejb-class>somepackage.MyEntityManagerBean</ejb-class>
        <session-type>Stateless</session-type>
        <transaction-type>Container</transaction-type>          
        <resource-ref id="some_id_goes_here">
            <res-ref-name>jdbc/my_ds</res-ref-name>
            <res-type>javax.sql.DataSource</res-type>
            <res-auth>Container</res-auth>
            <res-sharing-scope>Shareable</res-sharing-scope>
        </resource-ref>
    </session>
    </enterprise-beans>
    ...
    
    ...
    <session name="MyEntityManagerBean">
        <resource-ref name="jdbc/my_ds" binding-name="jdbc/my_ds"/>
    </session>
    <session name="MyEntityManagerBean2">
        <resource-ref name="jdbc/my_ds" binding-name="jdbc/my_ds"/>
    </session>
    ...  
    
    当我将这个*.jar作为Maven依赖项添加到我的*.war中时,问题就开始了


    提前感谢。

    资源引用并不定义数据源,它定义了对数据源的需求以及应用程序将用于查找数据源的名称。persistence.xml也是如此。您是否在Liberty server.xml中定义了数据源,或在web.xml或ejb jar.xml中定义了数据源元素?是的,我在server.xml.Attach中定义了这些xml的相关部分,因为您可能没有在persistence.xml中使用resource ref语法,或者存在一些错误配置。另外,在注入EntityManager的地方添加代码片段。完成后,请查看。
    ...
    <session name="MyEntityManagerBean">
        <resource-ref name="jdbc/my_ds" binding-name="jdbc/my_ds"/>
    </session>
    <session name="MyEntityManagerBean2">
        <resource-ref name="jdbc/my_ds" binding-name="jdbc/my_ds"/>
    </session>
    ...  
    
        @PersistenceContext(unitName="MyPersistentUnit")
        protected EntityManager entityManager;