Fab*_*och 5 java eclipse jersey wildfly
我正在尝试使用@PersistenceUnit注入EntityManagerFactory,但它始终为null.
我认为我的persistence.xml没问题,因为我可以使用以下代码获取EntityManager:
EntityManager em = Persistence.createEntityManagerFactory("myPersistenceUnit").createEntityManager();
Run Code Online (Sandbox Code Playgroud)
所以,我想知道我做错了什么,或者当使用Jersey(2.23)和Wildfly 10(JBoss EAP 7)时这是不可能的.
这是我到目前为止所做的:
在我的pom.xml中添加了以下依赖项:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.2.Final</version>
</dependency>
<dependency>
<groupId>com.hynnet</groupId>
<artifactId>oracle-driver-ojdbc6</artifactId>
<version>12.1.0.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)创建了persistence.xml:
<persistence-unit name="myPersistenceUnit"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<!-- All persistence classes must be listed -->
<class>com.mps.classes.TermosPesquisados</class>
<properties>
<!-- Provider-specific connection properties -->
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
<property name="javax.persistence.jdbc.url" value="JDBC_URL" />
<property name="javax.persistence.jdbc.user" value="USER" />
<property name="javax.persistence.jdbc.password" value="PASSWORD" />
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.connection.release_mode" value="after_transaction" />
<property name="hibernate.connection.isolation" value="2" />
</properties>
</persistence-unit>
Run Code Online (Sandbox Code Playgroud)修改了MyResource.java:
@ManagedBean
@Path("myresource")
public class MyResource {
@PersistenceUnit(unitName= "myPersistenceUnit")
private EntityManagerFactory emf;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
if(emf == null)
return "emf is null";
return "emf is not null";
}
}
Run Code Online (Sandbox Code Playgroud)添加了一个空的beans.xml(不确定是否有必要);
看来Jersey和Resteasy有冲突。这样,我有两个选择:
我最终选择了第二个选项,因为它更容易,而且我没有理由专门使用 Jersey。
这样,我必须更改我的 web.xml,替换为:
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
...
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
为了这:
<servlet-name>javax.ws.rs.core.Application</servlet-name>
...
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
*另一种选择是创建一个扩展应用程序类的类。
*beans.xml 不是必需的。
然后,我用 @Stateless 注释了我的资源类,并且能够正确注入 EntityManager:
@Path("myresource")
@Stateless
public class MyResource {
@PersistenceContext(unitName="myPersistenceUnit")
private EntityManager em;
...
Run Code Online (Sandbox Code Playgroud)
此时,EntityManager 没问题,但不知何故它使用的是 JBoss h2 内存数据库 (ExampleDS)。因此,我在 JBoss (OracleDS) 上配置了一个 Oracle 数据源,并更新了 persistence.xml 以使用 OracleDS 和 JTA 而不是“RESOURCE_LOCAL”:
<persistence-unit name="myPersistenceUnit" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:jboss/datasources/OracleDS</jta-data-source>
...
Run Code Online (Sandbox Code Playgroud)
通过这些步骤,我能够注入 EntityManager 并使我的 CRUD 操作成功。
| 归档时间: |
|
| 查看次数: |
2369 次 |
| 最近记录: |