我在演示应用程序中使用了JSF2+Spring3.1+Hibernate4,我想使用注释来创建会话工厂,但是我的DAO类没有在Jsf托管Bea类中初始化,所以我得到了空指针异常。我的ApplicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.otv"></context:component-scan>
<!-- Data Source Declaration -->
<bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
<property name="driverClass" value="org.postgresql.Driver" />
<property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/postgres" />
<property name="user" value="postgres" />
<property name="password" value="hariom" />
<property name="maxPoolSize" value="10" />
<property name="maxStatements" value="0" />
<property name="minPoolSize" value="5" />
</bean>
<!-- Session Factory Declaration -->
<bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean ">
<property name="dataSource" ref="DataSource" />
<property name="annotatedClasses">
<list>
<value>com.otv.model.User</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="packagesToScan" value="com.otv.user"></property>
</bean>
<!-- Transaction Manager is defined -->
<bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" >
<property name="sessionFactory" ref="SessionFactory"/>
</bean>
<!-- Enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="txManager"/>
</beans>
package com.otv.user.dao;
import java.util.List;
import com.otv.model.User;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
/**
*
* User DAO
*
* @author onlinetechvision.com
* @since 25 Mar 2012
* @version 1.0.0
*
*/
@Repository
@Transactional
public class UserDAO {
@Autowired
private SessionFactory sessionFactory;
/**
* Get Hibernate Session Factory
*
* @return SessionFactory - Hibernate Session Factory
*/
/* public SessionFactory getSessionFactory() {
return sessionFactory;
}
*//**
* Set Hibernate Session Factory
*
* @param SessionFactory - Hibernate Session Factory
*//*
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}*/
/**
* Add User
*
* @param User user
*/
public void addUser(User user) {
sessionFactory.getCurrentSession().save(user);
}
/**
* Delete User
*
* @param User user
*/
public void deleteUser(User user) {
sessionFactory.getCurrentSession().delete(user);
}
/**
* Update User
*
* @param User user
*/
public void updateUser(User user) {
sessionFactory.getCurrentSession().update(user);
}
/**
* Get User
*
* @param int User Id
* @return User
*/
public User getUserById(int id) {
List list = sessionFactory.getCurrentSession()
.createQuery("from User where id=?")
.setParameter(0, id).list();
return (User)list.get(0);
}
/**
* Get User List
*
* @return List - User list
*/
public List<User> getUsers() {
List list = sessionFactory.getCurrentSession().createQuery("from User").list();
return list;
}
}
package com.otv.managed.bean;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import com.otv.model.User;
import com.otv.user.dao.UserDAO;
import com.otv.user.service.IUserService;
/**
*
* User Managed Bean
*
* @author onlinetechvision.com
* @since 25 Mar 2012
* @version 1.0.0
*
*/
@ManagedBean(name="userMB")
@RequestScoped
public class UserManagedBean implements Serializable {
private static final long serialVersionUID = 1L;
private static final String SUCCESS = "success";
private static final String ERROR = "error";
//Spring User Service is injected...
List<User> userList;
private int id;
private String name;
private String surname;
@Autowired
private UserDAO userDAO;
/**
* Add User
*
* @return String - Response Message
*/
public String addUser() {
try {
User user = new User();
user.setId(getId());
user.setName(getName());
user.setSurname(getSurname());
userDAO.addUser(user);
return SUCCESS;
} catch (DataAccessException e) {
e.printStackTrace();
}
return ERROR;
}
/**
* Reset Fields
*
*/
public void reset() {
this.setId(0);
this.setName("");
this.setSurname("");
}
/**
* Get User List
*
* @return List - User List
*/
public List<User> getUserList() {
userList = new ArrayList<User>();
userList.addAll(userDAO.getUsers());
return userList;
}
/**
* Get User Service
*
* @return IUserService - User Service
*/
/**
* Set User List
*
* @param List - User List
*/
public void setUserList(List<User> userList) {
this.userList = userList;
}
/**
* Get User Id
*
* @return int - User Id
*/
public int getId() {
return id;
}
/**
* Set User Id
*
* @param int - User Id
*/
public void setId(int id) {
this.id = id;
}
/**
* Get User Name
*
* @return String - User Name
*/
public String getName() {
return name;
}
/**
* Set User Name
*
* @param String - User Name
*/
public void setName(String name) {
this.name = name;
}
/**
* Get User Surname
*
* @return String - User Surname
*/
public String getSurname() {
return surname;
}
/**
* Set User Surname
*
* @param String - User Surname
*/
public void setSurname(String surname) {
this.surname = surname;
}
}
现在,在Managedbean方法中,DAO对象为null,我得到的是null指针异常
简而言之,您的bean应该完全由JSF或Spring管理。
这一点有很多证据。只需在这里和/或Web上查找“JSF+spring Integartion”。
现在让我考虑一下这个问题,以增进你们的了解。
您为所有层选择本机JSF+EJB框架,这意味着您的DAO和服务将是@EJB
类,Bean将是@ManagedBean
类。您很可能还将使用Hibernate作为ORM解决方案和JPA提供程序,并通过EntityManager
进行数据库访问。您的视图技术将是JSF,因为它自然要与上述技术一起使用。例如,BalusC有许多关于使用JSF的启发性教程。
这两种选择都有其拥护者和反对者。有人说为什么要选不是本地的 <罢工> Sun's 甲骨文的解决方案,其他人说它过于复杂和混乱,缺乏可借鉴的来源。
由于这不是关于技术选择的争论,我将不在这里详细介绍,但将指出Spring是一个轻量级容器,它将运行在简单的servlet容器上,如Tomcat,而EJB需要一个应用服务器,如Glassfish。我认为这是将JSF作为基于组件的web框架与Spring作为轻量级依赖注入和业务层框架相结合的主要驱动力。
当我们决定将这两个框架集成在一起时,我将解释集成是如何工作的,以及为什么会出现NPE。
@repository
实现基本接口,以避免紧密耦合。它们将由Spring框架管理。@service
实现基接口。它们也将由Spring框架管理。请注意,如果您用@transactional
标记服务方法,那么Spring framework将为您提供开箱即用的事务管理。@component
和@scope(“value”)
并且必须由Spring管理,如果您希望将它用作依赖注入框架,允许通过@autowired
访问您的服务和其他bean。因此,NPE产生于对bean作为视图的逻辑部分应该由JSF管理的误解(注意@managedproperty
不能正常工作)。bean由JSF实例化,但您的服务驻留在JSF不知道的Spring上下文中,因此不可能注入。另一方面,如果bean保留在Spring上下文中,它的生命周期和依赖项将由Spring注入。
因此,为了使其工作,将bean标记为
@Component
@Scope("request")
public class SpringManagedBeanToBeUsedByJSF {
...
@Autowired
private SpringService springService;
...
}
和JSF一起使用Spring的所有先决条件。如果你迷失了方向,请参考这个极好的例子来了解设置。这样,所有bean都将由Spring管理,并且当您在faces-config.xml中附加EL-resolver(允许JSF“查看”Spring bean)并在web.xml中附加必要的侦听器时,所有bean都将在JSF视图中可见。当您这样做时,所有Spring bean都可以在.xhtml文件中引用,如果您需要将JSF操作放入bean中,只需继续将它们放入(Spring)托管bean中,或者使它们实现对JSF接口的vital等。只有这样才能实现集成。当然,您也可以在应用程序中使用JSF托管bean、@facesconverter
和@facesvalidator
类,只是不要相互干扰,但是在一个应用程序中使用两个依赖注入框架至少会让人困惑。
希望这能帮助你更好地了解情况。
您的代码也有一些问题,我不会在这个一般性的回答中强调。
主要内容:实例,运行测试结果以下代码显示了如何进行bean注入。 我们先定义一个消息bean,它有一个字符串属性来存储消息。 然后我们再定义另一个托管bean,并使用注解注入。 实例 打开 NetBean8.2,创建一个名为: InjectManagedBeans 的工程,并加入以下文件代码。 以下是文件:UserBean.java 中的代码 - 以下是是文件:index.xhtml 中的代码 - 以下是文件:Message
托管bean它是一个纯Java类,它包含一组属性和一组,方法。 以下是托管bean方法执行的常见功能: 验证组件的数据 处理组件触发的事件 执行处理以确定应用程序必须导航的下一页 它也可以作为JFS框架的模型。 JSF托管Bean示例 请看看下面一段示例代码 - 您可以通过以下方式使用此。 通过配置成XML文件。 通过使用注释。 通过XML文件配置托管Bean 在xml文件配置是比较旧方法。 在这
我正计划将一个web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加空beans.xml文件。 将所有JSF@ManagedBean替换为CDI@Named Annotations。 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。 将所有JSF@ManagedProperty替换为CDI@Inject Annotati
主要内容:使用XML配置,使用@ManagedBean注解JSF 托管bean(Managed Bean)是JSF注册的常规Java Bean类。托管bean包含getter和setter方法,业务逻辑。JSF托管bean作为UI组件的Model。 它存储JSF xhtml页面使用的数据。借助JSF框架,可以从JSF页面访问托管Bean。 在JSF 1.2中,我们必须在JSF配置文件(如)中注册受管理的bean。 从JSF 2.0可以使用注解注册管理be
问题内容: 我在演示应用程序中使用JSF2 + Spring3.1 + Hibernate4,我将要使用批注创建会话工厂,但我的DAO类未在Jsf Managed Bea类中初始化,因此我得到了Null指针异常。我的 applicationContext.xml UserDAO.java类 和我的ManagedBean类 现在在Managedbean方法中,DAO对象为null,并且我得到了Nul
问题内容: 我了解托管bean的工作方式类似于控制器,因为你的唯一任务是将“视图层”与模型“链接”。 要将bean用作托管bean,我必须声明注释,这样我就可以直接与bean通信JSF。 如果要在此managedBean中注入某些组件(来自Spring),则有两种可能的方法: 在ManagedBean中选择属性(例如“ BasicDAO dao”),然后在该属性上方进行声明。这样做,我是将”bas