JSF 2.2 Target Unreachable,标识符 [whatever] 解析为 null

JSF 2.2 Target Unreachable, identifier [whatever] resolved to null

我正在尝试将 JSF 2.2 与 Spring 4 和 Spring Data JPA (Hibernate) 集成。当我按下保存按钮时出现以下异常:

javax.el.PropertyNotFoundException: /index.xhtml @14,66 value="#{registerEmployee.employee.employeeName}": Target Unreachable, identifier [registerEmployee] resolved to null

Eclipse:Oxygen.3a 版本 (4.7.3a)

Java: 1.8.0_171

服务器:apache-tomee-plume-7.0.4

我曾尝试在 Whosebug 中搜索解决方案,但不幸的是我无法解决我的问题。我已经尝试了 5 天,现在可能出了什么问题。 这仅在我使用 LocalContainerEntityManagerFactoryBean 时发生,因为 Spring Data JPA。所有提到的 classes(applicationContext.xml 除外)在其工作的不同项目中都是相同的。 (工作的)正在使用的那些项目之间的区别:

org.springframework.orm.hibernate5.LocalSessionFactoryBean

有映射资源属性:

<property name="mappingResources">
  <list>
    <value>domain-classes.hbm.xml</value>
  </list>
</property>

使用@Autowired的地方导入是:org.springframework.beans.factory.annotation.Autowired;

其中使用 @Component 的导入是:org.springframework.stereotype.Component;

使用@Transactional的地方导入是:org.springframework.transaction.annotation.Transactional;

使用 @ManagedBean 的地方是: javax.faces.bean.ManagedBean;

使用 @ManagedProperty 的导入是: javax.faces.bean.ManagedProperty;

使用 @SessionScoped 的导入是: javax.faces.bean.SessionScoped;

我也试过不使用 @Autowired@ManagedProperty 但我得到了同样的异常。

这是我的员工实体 class:

import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import org.springframework.stereotype.Component;

@Entity
@Table(name = "employee")
@Component
public class Employee{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "EMP_ID")
private long employeeId;

@Column(name = "EMP_NAME")
private String employeeName;

@Column(name = "EMP_HIRE_DATE")
private Date employeeHireDate;

@Column(name = "EMP_SALARY")
private double employeeSalary;

public long getEmployeeId() {
    return employeeId;
}

public void setEmployeeId(long employeeId) {
    this.employeeId = employeeId;
}

public String getEmployeeName() {
    return employeeName;
}

public void setEmployeeName(String employeeName) {
    this.employeeName = employeeName;
}

public Date getEmployeeHireDate() {
    return employeeHireDate;
}

public void setEmployeeHireDate(Date employeeHireDate) {
    this.employeeHireDate = employeeHireDate;
}

public double getEmployeeSalary() {
    return employeeSalary;
}

public void setEmployeeSalary(double employeeSalary) {
    this.employeeSalary = employeeSalary;
}
}

托管bean,RegisterEmployee:

@ManagedBean(name = "registerEmployee")
@SessionScoped
public class RegisterEmployee implements Serializable {

@ManagedProperty("#{employeeService}")
private EmployeeService employeeService;

@Autowired
private Employee employee;

public EmployeeService getEmployeeService() {
    return employeeService;
}

public void setEmployeeService(EmployeeService employeeService) {
    this.employeeService = employeeService;
}

public Employee getEmployee() {
    return employee;
}

public void setEmployee(Employee employee) {
    this.employee = employee;
}

public String register() {
    // Calling Business Service
    employeeService.register(employee);
    // Add message
    FacesContext.getCurrentInstance().addMessage(null, 
            new FacesMessage("The Employee "+this.employee.getEmployeeName()+" Is Registered Successfully"));
    return "";
   }
}

员工资料库:

public interface EmployeeRepository extends JpaRepository<Employee, Integer>{ 

}

员工服务:

@Component
public class EmployeeService implements Serializable {

@Autowired
private EmployeeRepository employeeRepository;

public EmployeeRepository getEmployeeRepository() {
return employeeRepository;
}

public void setEmployeeRepository(EmployeeRepository employeeRepository) {
    this.employeeRepository = employeeRepository;
}

@Transactional
public void register(Employee employee) {
    employeeRepository.save(employee);
}

}

POM.xml

<repositories>
  <repository>
    <id>prime-repo</id>
    <name>PrimeFaces Maven Repository</name>
    <url>http://repository.primefaces.org</url>
    <layout>default</layout>
  </repository>
</repositories>

<dependencies>

    <!-- Expression Language -->
    <dependency>
        <groupId>javax.el</groupId>
        <artifactId>javax.el-api</artifactId>
        <version>3.0.0</version>
    </dependency>

    <!-- JSTL Library -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.1.2</version>
    </dependency>

    <!-- Servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

    <!-- Java Server Faces Implementation -->
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-impl</artifactId>
        <version>2.2.4</version>
    </dependency>

    <!-- Java Server Faces API -->
    <dependency>
        <groupId>com.sun.faces</groupId>
        <artifactId>jsf-api</artifactId>
        <version>2.2.4</version>
    </dependency>       

    <!-- Primefaces Version 5 -->
    <dependency>
        <groupId>org.primefaces</groupId>
        <artifactId>primefaces</artifactId>
        <version>5.0</version>
    </dependency>

    <!-- Primefaces Theme Library -->
    <dependency>
        <groupId>org.primefaces.themes</groupId>
        <artifactId>blitzer</artifactId>
        <version>1.0.10</version>
    </dependency>

    <!-- Hibernate Core -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.10.Final</version>
    </dependency>

    <!-- Hibernate Entity Manager -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.2.10.Final</version>
    </dependency>

    <!-- MySQL Connector Java -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.44</version>
    </dependency>

    <!-- Spring Context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.16.RELEASE</version>
    </dependency>

    <!-- Spring ORM -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>4.3.16.RELEASE</version>
    </dependency>

    <!-- Spring Web -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.16.RELEASE</version>
    </dependency>

    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>2.0.5.RELEASE</version>
    </dependency>

    <!-- LOG4J -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>   

   <!-- JUnit -->  
   <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
  </dependency>
 </dependencies>

 <build>
     <finalName>Nova</finalName>
        <plugins>
           <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.1</version>
              <configuration>
                 <source>1.8</source>
                <target>1.8</target>
              </configuration>
          </plugin>
      </plugins>

</build>

applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/data/jpa
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    ">

<!--  Enable Spring annotations  -->
<context:annotation-config />

<!-- Scans for repositories that will be auto-registered -->
<jpa:repositories base-package="where.repositories.are.located" />

<!-- Scans for components (beans) which are managed by Spring -->
<context:component-scan base-package="where.services.are.located, where.models.are.located" />

<!-- MySQL Datasource-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/nova" />
    <property name="username" value="username" />
    <property name="password" value="supersecretpassword" />
</bean>

<!-- EntityManagerFactory and JPAVendorAdapter -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:packagesToScan="where.models.are.located"
        p:dataSource-ref="dataSource"
        >
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
            <property name="generateDdl" value="false"/>
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
        </bean>
    </property>
</bean>

<!-- Transaction Manager -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

面孔-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config 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/web-facesconfig_2_2.xsd"
    version="2.2">
<application>
   <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
</faces-config>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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/web-app_3_1.xsd"
     version="3.1">

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

<context-param>
    <param-name>javax.faces.CONFIG_FILES</param-name>
    <param-value>WEB-INF/faces-config.xml</param-value>
</context-param>

<context-param>
   <param-name>javax.faces.PROJECT_STAGE</param-name>
   <param-value>Development</param-value>
</context-param>

<context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

index.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">
<h:head>
   <script name="jquery/jquery.js" library="primefaces"></script>
   <title>Register Employee</title>
</h:head>
<h:form>
    <p:growl id="messages"></p:growl>
    <p:panelGrid columns="2">
       <p:outputLabel value="Enter Employee Name:"></p:outputLabel>
       <p:inputText value="#{registerEmployee.employee.employeeName}"> 
  </p:inputText>
    <p:outputLabel value="Enter Employee Hire Date:"></p:outputLabel>
    <p:calendar value="#{registerEmployee.employee.employeeHireDate}"> 
  </p:calendar>
    <p:outputLabel value="Enter Employee Salary:"></p:outputLabel>
    <p:inputText value="#{registerEmployee.employee.employeeSalary}"> 
  </p:inputText>                        
  </p:panelGrid>
  <p:commandButton value="Register" action="#{registerEmployee.register}" 
  update="messages"></p:commandButton>
  </h:form>
  </html>

@Autowired 或 @Inject 类 是一个错误的模式,它们使用 @Entity 注释。