2016-10-30 3 views
0

У меня есть следующая проблема при попытке разработать приложение REST с помощью JPA и EJB.Невозможно использовать EJB из веб-приложения

У меня есть 3 проекта в NetBeans (то же самое рабочее пространство, только проекты, не 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 (один с контроллерами сущности). Я также тестировал этот проект EJB с основным классом Java, и он работал.

  • Последний проект представляет собой веб-приложение, как вы можете себе представить, я хочу использовать 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 
    

Вот код веб-приложения (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(); 
    } 
} 

Так Я использую 2 баночки для веб-проекта, один с EJB модулей, а другой с субъектами и контроллерами ..

Вот persistence.xml порожденный JPA проекта:

<?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> 

Спасибо!

+0

Ошибка сообщение говорит 'Invalid persistence.xml.' - можете ли вы разместить свой persistence.xml на вопрос, пожалуйста, – Mike

+0

Вам нужно создать интерфейс для ejb. Баннер EJB не должен находиться в состоянии войны, но развернут непосредственно в jee sever. –

+0

У меня есть интерфейс для модуля EJB (внутри одного проекта EJB), но поскольку я использую аннотацию '@ LocalBean', нет необходимости реализовывать этот интерфейс, не так ли? @Mr_Thorynque –

ответ

1

Вызвано: javax.persistence.PersistenceException: Неверно persistence.xml. Ошибка синтаксического анализа XML [строка: -1, column: -1]: cvc-elt.1.a: Не удается найти декларацию элемента 'persistence'.

Здесь:

<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"> 
+0

У него был закрывающий тег, я просто пропустил его добавить в сообщение, извините .. –

+0

Нет проблем, но я уверен, что проблема в том файле :) Я обновил свой ответ :) – davidxxx

+0

Огромное вам спасибо работает !!!, я пытался заставить его работать часами, я довольно новичок в таких концепциях, как ejb и jpa, спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^