我有一个非常简单的Web应用程序,运行在WebSphere Application Server 18.0.0.2
上。该应用程序打包到WAR中,并放在dropins
下(为简单起见)。
我的server.xml
如下:
<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">
<featureManager>
<feature>javaee-8.0</feature>
</featureManager>
<httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443" />
<!-- Automatically expand WAR files and EAR files -->
<applicationManager autoExpand="true"/>
<!-- THE JAR IS THERE (UNDER Liberty lib directory) -->
<library id="H2JDBCLib">
<fileset dir="${wlp.install.dir}/lib" includes="h2-1.4.197.jar"/>
</library>
<!-- AND THIS IS MY DATA SOURCE DEFINITION -->
<dataSource id="h2test" jndiName="jdbc/h2test">
<jdbcDriver libraryRef="H2JDBCLib"/>
<properties.db2.jcc databaseName="testdb" serverName="localhost" portNumber="8082" user="sa" />
</dataSource>
</server>
我有一个非常简单的实体和一个服务(无状态EJB):
@Stateless
public class CustomerService {
@PersistenceContext(unitName = "h2test")
private EntityManager entityManager;
public List<Customer> getAllCustomers() {
return entityManager
.createNamedQuery(FIND_ALL, Customer.class)
.getResultList();
}
}
我在META-INF下的persistence.xml
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="h2test" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/h2test</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>
</persistence>
我认为这些简单的配置应该足以部署和运行这种hello-world-type应用程序。但是我在运行时遇到错误:
[ERROR ] CNTR0019E: EJB throws an exception when invoking "getAllCustomers".
Details: javax.ejb.EJBException: The java:comp/env/com.my.app.service.CustomerService/entityManager reference of type javax.persistence.EntityManager for the null component in the my-app.war module of the my-app application cannot be resolved.
at com.ibm.wsspi.injectionengine.InjectionBinding.getInjectionObject(InjectionBinding.java:1489)
at [internal classes]
at com.my.app.service.EJSLocalNSLCustomerService_22d8d9f5.getAllCustomers(EJSLocalNSLCustomerService_22d8d9f5.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
EntityManager注入失败。从IBM的文档来看,尚不清楚该怎么做。
我的应用程序中没有其他XML文件(配置文件)。
我想念什么吗?
答案 0 :(得分:2)
我看到的主要问题是server.xml中的<datasource>
定义,您使用了<properties.db2.jcc>
元素,它对应于IBM DB2 JCC JDBC驱动程序。由于Liberty没有专用的<properties.h2>
配置,因此您必须使用通用的<properties>
配置元素,并在<jdbcDriver>
元素上定义DataSource类名称。
配置应如下所示:
<dataSource id="h2test" jndiName="jdbc/h2test">
<!-- Define the DataSource class names on the <jdbcDriver> element -->
<jdbcDriver
javax.sql.XADataSource="org.h2.jdbcx.JdbcDataSource"
javax.sql.ConnectionPoolDataSource="org.h2.jdbcx.JdbcDataSource"
javax.sql.DataSource="org.h2.jdbcx.JdbcDataSource"
libraryRef="H2JDBCLib"/>
<!-- set the connection URL on the <properties> element.
this corresponds to the setURL() method on H2's JdbcDataSource class.
you may also list any properties here that have a corresponding setXXX method on H2's JdbcDataSource class -->
<properties URL="jdbc:h2:mem:testdb"/>
</dataSource>
此外,最好将H2 JDBC驱动程序放在${server.config.dir}
或${shared.resource.dir}
下,因为${wlp.install.dir}/lib
是Liberty运行时jar所在的位置。您不想将您的应用程序jar与其中的内容混在一起!
<library id="H2JDBCLib">
<fileset dir="${server.config.dir}" includes="h2-1.4.197.jar"/>
</library>
最后,请确保您的persistence.xml文件在WAR应用程序中的正确位置。应该在WEB-INF/classes/META-INF/persistence.xml
作为中间调试步骤,您可以像这样检查以确保可从应用程序中解析出数据源:
@Resource(lookup = "jdbc/h2test")
DataSource ds;
// ...
ds.getConnection().close();
一旦该部分开始工作,请继续注入EntityManager
。另外,如果出现问题,请务必检查${server.config.dir}/logs/messages.log
以获得更详细的错误消息。