【问题标题】:Can't use EJB from Web Application无法从 Web 应用程序使用 EJB
【发布时间】:2016-10-30 20:20:30
【问题描述】:

我在尝试使用 JPAEJB 开发 REST 应用程序时遇到了下一个问题。

我在 NetBeans 中有 3 个项目(相同的工作区,只是项目,不是 EAR 或那些奇怪的东西):

  • 其中一个是 Java 应用程序,我在其中从数据库创建了一些实体类。在同一个项目中,我创建了其他包,其中包含来自实体的控制器类。我测试了创建 java 主类并使用控制器的项目。

  • 另一个项目是一个 EJB 模块,它就像一个包和它里面的下一个类一样简单:

    package com.studentejb;
    import java.util.List;
    import javax.ejb.LocalBean;
    import javax.ejb.Stateless;
    import studentdao.StudentTO;
    import studentdao.StudentJpaController;
    
    @Stateless
    @LocalBean
    public class StudentEJB {
    
        private StudentJpaController studentDao = new StudentJpaController();
    
        public List<StudentTO> findStudents() {
            return studentDao.findStudentTO();
        }
    }
    

如您所见,我导入了之前的 JAR 项目(带有实体控制器的项目)。我还用一个 java 主类测试了这个 EJB 项目,它工作正常。

  • 最后一个项目是一个 Web 应用程序,您可以想象我想使用上一个项目的 EJB 模块,但是在尝试进入资源 http://localhost:8080/studentWeb/student/ 时出现以下错误:

    12:00:12,384 ERROR [io.undertow.request] (default task-2) UT005023:    Exception handling request to /studentWeb/student/hola:     com.google.common.util.concurrent.ExecutionError:     java.lang.ExceptionInInitializerError
    at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2201)
    at com.google.common.cache.LocalCache.get(LocalCache.java:3937)
    at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941)
    at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4824)
    at org.jboss.weld.util.cache.LoadingCacheUtils.getCacheValue(LoadingCacheUtils.java:49)
    .
    .
    .
    
    at java.lang.Thread.run(Thread.java:745)
    Caused by: java.lang.ExceptionInInitializerError
    at studentdao.StudentJpaController.<init>(StudentJpaController.java:40)
    at com.studentejb.StudentEJB.<init>(StudentEJB.java:23)
    at com.studentweb.Resources.<init>(Resources.java:52)
    at com.studentweb.Resources$Proxy$_$$_WeldClientProxy.<init>(Unknown Source)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    .
    .
    .
    
    ... 58 more
    Caused by: javax.persistence.PersistenceException: Unable to locate persistence units 
    at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:99)
    at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:86)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:67)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
    at studentdao.EntityProvider.<clinit>(EntityProvider.java:20)
    ... 80 more
    
    Caused by: javax.persistence.PersistenceException: Invalid persistence.xml.
    Error parsing XML [line : -1, column : -1] : cvc-elt.1.a: Cannot find the     declaration of element 'persistence'.
    
    at org.hibernate.jpa.boot.internal.PersistenceXmlParser.validate(PersistenceXmlParser.java:377)
    at org.hibernate.jpa.boot.internal.PersistenceXmlParser.loadUrl(PersistenceXmlParser.java:310)
    at org.hibernate.jpa.boot.internal.PersistenceXmlParser.parsePersistenceXml(PersistenceXmlParser.java:114)
    at org.hibernate.jpa.boot.internal.PersistenceXmlParser.doResolve(PersistenceXmlParser.java:104)
    at org.hibernate.jpa.boot.internal.PersistenceXmlParser.locatePersistenceUnits(PersistenceXmlParser.java:86)
    at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:95)
    ... 85 more
    

这里是 web 应用程序 (Resources.java) 的代码:

@Path("/student")
public class Resources {
    @EJB
    private StudentEJB studentEjb;

    @Context
    private UriInfo context;

    public Resources() throws FileNotFoundException, IOException, NamingException {
        studentEjb = new StudentEJB();
    }

    @GET
    @Path("/")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getJson() {
        return Response.ok(studentEjb.findStudents()).build();
    }
}

所以我在 Web 项目中使用了 2 个 JAR,一个带有 EJB 模块,另一个带有实体和控制器。

这是JPA项目生成的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://xmlns.jcp.org/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_2_0.xsd">
  <persistence-unit name="studentJPAPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <!-- <provider>org.hibernate.ejb.HibernatePersistence</provider> -->
    <class>studentjpa.Address</class>
    <class>studentjpa.Phone</class>
    <class>studentjpa.Student</class>
    <class>studentjpa.Email</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=tca_student_db;integratedSecurity=true"/>
      <property name="javax.persistence.jdbc.user" value="xxxx"/>
      <property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
      <property name="javax.persistence.jdbc.password" value="xxxx"/>
    </properties>
  </persistence-unit>
</persistence>

谢谢!

【问题讨论】:

  • 错误消息是Invalid persistence.xml. - 你能把你的persistence.xml发布到问题中吗
  • 你需要为ejb创建接口。 ejb jar 不必处于战争状态,而是直接部署在 jee sever 中。
  • 我有一个用于 EJB 模块的接口(在同一个 EJB 项目中),但由于我使用的是@LocalBean 注释,所以没有必要实现该接口不是吗? @Mr_Thorynque

标签: java jpa jakarta-ee ejb


【解决方案1】:

原因:javax.persistence.PersistenceException:无效 持久性.xml。解析 XML 时出错 [行:-1,列:-1]: cvc-elt.1.a:找不到元素“持久性”的声明。

这里:

<persistence version="2.0" xmlns="http://xmlns.jcp.org/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_2_0.xsd">

xmlns :http://xmlns.jcp.org/xml/ns/persistence 与 xsischemaLocation 中的命名空间不匹配 http://java.sun.com/xml/ns/persistence

尝试在两者中使用相同的:

<persistence version="2.0" 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_2_0.xsd">

【讨论】:

  • 没问题,但我确定问题出在那个文件中 :) 我更新了我的答案 :)
  • 非常感谢它的工作!!!,我一直在努力让它工作几个小时,我对 ejb 和 jpa 这样的概念还很陌生,谢谢
  • ejb 和 jpa 是大块,但 xml 也是 :) 祝下一个好运 :)
猜你喜欢
  • 1970-01-01
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 2011-02-18
  • 1970-01-01
相关资源
最近更新 更多