2016-01-06 3 views
0

У меня есть веб-проект со следующей установкой:Wildfly: EJB Призвание не удалось - NullPointerException

  • Wildfly 9,0
  • JSF 2,2
  • EJB 3.2
  • Hibernate 4.2.21

Я хочу сделать простой вызов метода из ManagedBean в инжектируемый EJB. Hibernate настроен как EntityManager для EJB.

Вид:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<h:html xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
    xmlns:o="http://omnifaces.org/ui" 
    xmlns:of="http://omnifaces.org/functions"> 
<h:head> 

</h:head> 
<h:body> 

    <h:form> 
     <h:inputText value="#{courseController.course.room}"/> 

     <h:commandButton 
      value="save" action="#{courseController.addCourse}"/>  
    </h:form> 

</h:body> 
</h:html> 

ManagedBean для вида:

import java.io.Serializable; 

import javax.ejb.EJB; 
import javax.faces.bean.ViewScoped; 
import javax.inject.Named; 

import de.uulm.vs.increase.teachinput.ejb.CourseEJB; 
import de.uulm.vs.increase.teachinput.model.Course; 

@Named(value="courseController") 
@ViewScoped 
public class CourseController implements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    @EJB 
    private CourseEJB courseEJB; 

    private Course course = new Course(); 

    public String addCourse() 
    { 
     courseEJB.addCourse(course); 
     return "course.xhtml"; 
    } 

    public Course getCourse() 
    { 
     return course; 
    } 

    public void setCourse(Course course) { 
     this.course = course; 
    } 

} 

EJB-:

import javax.ejb.LocalBean; 
import javax.ejb.Stateless; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import de.uulm.vs.increase.teachinput.model.Course; 

@Stateless(mappedName = "courseEJB") 
@LocalBean 
public class CourseEJB implements CourseEJBLocal { 

    @PersistenceContext(unitName = "teach-input") 
    EntityManager em; 

    public CourseEJB() { 

    } 

    public Course addCourse(Course c) 
    { 
     em.persist(c); 
     return c; 
    } 

} 

Интерфейс EJB:

import javax.ejb.Local; 

import de.uulm.vs.increase.teachinput.model.Course; 

@Local 
public interface CourseEJBLocal { 

    public Course addCourse(Course c); 
} 

persistence.xml:

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

    <persistence-unit name="teach-input" transaction-type="JTA"> 
     <description> 
      Persistence unit for the teach-input project. 
     </description> 

     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <properties> 

      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/test"></property> 
      <property name="hibernate.connection.username" value="user"></property> 
      <property name="hibernate.connection.password" value="pw"></property> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"></property> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"></property> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.hbm2ddl.auto" value="create" /> 

     </properties> 

    </persistence-unit> 

</persistence> 

beans.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
          http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
     version="1.1" bean-discovery-mode="all"> 
</beans> 

Я строю один военный файл через мавена

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>groupid</groupId> 
    <artifactId>artifactid</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>war</packaging> 
    <name>name</name> 

    <properties> 
     <hibernate.version>4.2.21.Final</hibernate.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 

    <dependencies> 
     <!-- MySQL --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.37</version> 
     </dependency> 
     <!-- Hibernate --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>${hibernate.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>${hibernate.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-envers</artifactId> 
      <version>${hibernate.version}</version> 
     </dependency> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
     </dependency> 

     <!-- EJB --> 
     <dependency> 
      <groupId>javax.ejb</groupId> 
      <artifactId>javax.ejb-api</artifactId> 
      <version>3.2</version> 
      <scope>provided</scope> 
     </dependency> 

     <!-- JSF --> 

     <dependency> 
      <groupId>javax.faces</groupId> 
      <artifactId>javax.faces-api</artifactId> 
      <version>2.2</version> 
      <scope>provided</scope> 
     </dependency> 

     <!-- WELD --> 
     <dependency> 
      <groupId>org.jboss.weld.servlet</groupId> 
      <artifactId>weld-servlet</artifactId> 
      <version>2.3.2.Final</version> 
      <scope>provided</scope> 
     </dependency> 

    </dependencies> 

    <build> 
     <finalName>finalname</finalName> 
     <defaultGoal>install</defaultGoal> 
     <pluginManagement> 
      <plugins> 
       <!-- WildFly plugin to deploy the application --> 
       <plugin> 
        <groupId>org.wildfly.plugins</groupId> 
        <artifactId>wildfly-maven-plugin</artifactId> 
        <version>1.0.2.Final</version> 
        <configuration> 
         <filename>${project.build.finalName}.war</filename> 
         <hostname>127.0.0.1</hostname> 
         <port>9990</port> 
         <username>user</username> 
         <password>password</password> 
        </configuration> 
       </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-compiler-plugin</artifactId> 
        <configuration> 
         <source>1.7</source> 
         <target>1.7</target> 
         <encoding>UTF-8</encoding> 
        </configuration> 
       </plugin> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-eclipse-plugin</artifactId> 
        <configuration> 
         <downloadSources>true</downloadSources> 
         <downloadJavadocs>true</downloadJavadocs> 
        </configuration> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
    </build> 

</project> 

Сервер является развертывание должным образом. При вызове метод addCourse() соперничает веб-интерфейс, появляется следующее исключение:

WFLYEJB0034: EJB Призвание потерпело неудачу на компоненте CourseEJB для метода общественного курса addCourse (курс): javax.ejb.EJBException: java.lang.NullPointerException

Так что, похоже, что что-то происходит с инъекцией EJB. Я искал его в документации WildFly, но глава конфигурации EJB отсутствует.

Заранее благодарим за любую помощь.

+0

Попробуйте инъекционного 'CourseEJBLocal courseEJB' вместо' CourseEJB courseEJB'. – Geinmachi

+0

Tried CourseEJBLocal courseEJB, NullPointerException все еще там. – bauz

ответ

0
  1. удалить @LocalBean аннотацию из вашей реализации EJB,
  2. удалить атрибут mappedName - вам нужен он в этом примере?
  3. Вводят с помощью интерфейса, например @EJB CourseEJBLocal

Надежда, что помогает

+0

Следуйте за тремя шагами выше.NullPointerException все еще существует. – bauz

+0

Хорошо странно, попробуйте самое простое решение. Удалите интерфейс (или отключите аннотацию) и просто добавьте комментарий к публичному классу EJB @ Stateless CourseEJB, а затем просто используйте @ EJB CourseEJB. Это работает? – javapapo

+0

После удаления интерфейса и аннотации компонента отображается следующее сообщение об ошибке: Ошибка ввода ресурсов в управляемый бидом CDI. Не удается найти ресурс с именем java: comp/env/package.controller.CourseController/courseEJB Почему имя java: comp, а не что-то вроде app/global/module? – bauz

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