Spring DAO ist nicht injiziert, die in JSF managed bean
Ich bin mit JSF2+Spring3.1+Hibernate4 in meiner demo-Anwendung, und ich werde verwenden möchten annotation zu erstellen, session-factory, aber mein DAO-Klasse wird nicht initialisiert, die in Jsf Managed Bea Klasse, so bin ich immer Null-Zeiger-Ausnahme.
Meine 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>
UserDAO.java Klasse
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;
}
}
UND meiner managedBean Klasse
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;
}
}
Nun in der Managedbean Methode DAO-Objekt null ist und ich bin immer Null-Zeiger-Ausnahme
WARNUNG: #{userMB.addUser}: java.lang.NullPointerException
javax.Gesichter.FacesException: #{userMB.addUser}:
java.lang.NullPointerException bei
com.Sonne.Gesichter.- Anwendung.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
bei javax.Gesichter.Komponente.UICommand.broadcast(UICommand.java:315) at
javax.Gesichter.Komponente.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
bei
javax.Gesichter.Komponente.UIViewRoot.processApplication(UIViewRoot.java:1259)
bei
com.Sonne.Gesichter.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
bei com.Sonne.Gesichter.lifecycle.Phase.doPhase (- Phase.java:101) at
com.Sonne.Gesichter.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
bei javax.Gesichter.webapp.FacesServlet.service(FacesServlet.java:593) an
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
bei
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
bei
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
bei
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
bei
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
bei
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
bei
org.apache.catalina.Ventile.ErrorReportValve.invoke(ErrorReportValve.java:98)
bei
org.apache.catalina.Ventile.AccessLogValve.invoke(AccessLogValve.java:927)
bei
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
bei
org.apache.catalina.- Anschluss.CoyoteAdapter.service(CoyoteAdapter.java:407)
bei
org.apache.coyote.http11.AbstractHttp11Processor.Prozess(AbstractHttp11Processor.java:1001)
bei
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.Prozess(AbstractProtocol.java:585)
bei
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
bei
java.util.gleichzeitige.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
bei
java.util.gleichzeitige.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
bei java.lang.Thread.run(Thread.java:662), Verursacht durch:
javax.Gesichter.el.EvaluationException: java.lang.NullPointerException bei
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
bei
com.Sonne.Gesichter.- Anwendung.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
... 23 mehr Verursacht durch: java.lang.NullPointerException bei
com.otv.verwaltete.bean.UserManagedBean.addUser(UserManagedBean.java:57)
bei der sun.reflektieren.NativeMethodAccessorImpl.invoke0(Native Method) at
Sonne.reflektieren.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
bei
Sonne.reflektieren.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
bei java.lang.reflektieren.Methode.invoke(Method.java:597) at
org.apache.el.parser.AstValue.invoke(AstValue.java:264) at
org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
bei
com.Sonne.Gesichter.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
bei
javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 24 mehr
- Sie können nicht injizieren, spring beans in JSF mit
Autowired
.verwenden Sie@ManagedProperty
aufUserDAO
stattAutowired
.Und Sie müssen entfernen Sie alle Einträge imfaces-coifig.xml
zu vermeiden ausblenden von Beschriftungen, indem SieXML
Konfiguration..Sie können einen Blick auf diesen Frühling website für zusätzliche Konfiguration .static.springsource.org/spring/docs/2.5.x/api/org/... - Leider kann man nicht injizieren, Spring beans in JSF managed beans mit
@ManagedProperty
entweder. Die Injektion wie dies funktionieren könnte, aber nur für@SessionScoped
oder@RequestScoped
Bohnen, weil diese Anmerkungen übersetzt wird@Scope("session")
und@Scope("request")
jeweils, zwingen Bohnen verwaltet werden, die von Frühling und Leben in seinem Zusammenhang, aber dennoch, aufgrund deklariert faces-config.xml EL-resolver werden Sie vollständig sichtbar in der JSF-views. Einfach nicht betrügen sich selbst und lassen Sie es sein das Spring-framework wird die Verwaltung Ihrer Bohnen. - Also, was ist die beste Lösung?
- Wie kann die UserManagedBean Serialisierbar, wenn es eine nicht-transiente Feld UserDAO?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Um es kurz zu sagen, deine Bohnen sollten komplett verwaltet entweder JSF oder Spring.
Es gibt viele Beweise zu diesem Punkt. Suchen Sie einfach nach "JSF + Feder integartion" hier und/oder auf die web.
Lassen Sie mich nun darüber nach, die Ausgabe auf um Ihr Verständnis.
Viele web-Anwendungen bestehen aus mehreren 'Schichten' auch als 'Ebenen' der Anwendung: web-Schicht, oder eine Präsentationsschicht für die Anzeige von Seiten in Ihrer Anwendung, business-Schicht, oder mittlere Schicht für die Ausführung der Logik und Geschäftsregeln für Ihre Anwendung vorgenommen und data tier, oder persistece tier überträgt Daten zu/von der Datenbank. Diese Schichten haben die folgende Konfiguration:
Entity
Klassen, die die Daten aus Ihrer Datenbank, und die meisten plausibel verwendet, die durch ein ORM-framework wie Hibernate;DAO
Klassen, die verwendet werden, um access-Datenbank und mindestens CRUD-Operationen auf der Datenbank und vor allem für Ihre web-Teil wieder Entity-Klassen für web-tier;Service
Klassen, die business-Operationen Anwendung bietet;Bean
Klassen, sichern Sie Ihre Ansichten und wird die meisten wahrscheinlich enthalten Daten, Maßnahmen, Methoden, Transformationen etc. verwendet in Ihre web-Seiten.Der nächste Schritt ist die Auswahl von Rahmen für Ihre web-Anwendung.
Wählen Sie die Feder für alle Schichten, was bedeutet, dass Ihre DAOs werden
@Repository
Klassen, Ihre Leistungen werden@Service
Klassen und Ihre Bohnen@Component
Klassen. Sie werden die meisten wahrscheinlich ein ORM-framework wie Hibernate Umgang mit der Datenbank, so dass Ihre Entitäten werden JPA@Entity
Klassen richtig konfiguriert im Ruhezustand Stil. Ihr view-Technologie wird sehr wahrscheinlich sein, Spring MVC, die ausgearbeitet wurde, um die Arbeit mit Federkern. Zum Beispiel, Mkyong hat viele einfache tutorials mit Spring.Wählen Sie native JSF+EJB-framework für alle Ebenen, was bedeutet, dass Ihre DAOs und Services
@EJB
Klassen Ihre Bohnen@ManagedBean
Klassen. Sie werden die meisten wahrscheinlich auch Hibernate als ORM-Lösung und JPA-provider und werden Datenbank-Zugriff überEntityManager
. Ihr view-Technologie wird JSF als es war natürlich beabsichtigt, mit den oben genannten Technologien. Zum Beispiel, BalusC hat viele aufschlussreiche tutorials auf der Verwendung von JSF.Beiden Möglichkeiten hat Ihre Befürworter und Gegner. Einige sagen, warum etwas nicht heimisch
SonneOracle ist die Lösung, andere sagen, es ist zu Komplex und verwirrend und es fehlen Quellen, um daraus zu lernen.Da dies nicht ein Streit über die Technologie-Auswahl werde ich nicht ins Detail gehen, aber darauf hingewiesen, dass der Frühling ist ein lightweight-container ausgeführt wird, auf einfache servlet-Containern wie Tomcat in der Erwägung, dass EJBs benötigen einen application server wie Glassfish laufen soll. Ich denke, dass dies die treibende Kraft für die Kombination von JSF als Komponenten-basierte web-framework und Spring als leichtgewichtiger dependency injection-und business-tier-framework.
Als wir beschlossen zu integrieren beide frameworks zusammen, ich werde erklären, wie die integration funktioniert und warum NPEs auftreten.
@Repository
base Implementierung von Schnittstellen zu vermeiden, die enge Kopplung. Sie wird verwaltet durch das Spring-framework.@Service
auch die Umsetzung der Basisschnittstellen. Sie wird auch verwaltet werden, indem das Spring-framework. Beachten Sie, dass das Spring-framework wird für eine out-of-the-box-Transaktion-management für Sie, wenn Sie mark-service-Methoden mit@Transactional
.@Component
und@Scope("value")
und verwaltet werden müssen, bis zum Frühjahr, wenn Sie möchten, es zu benutzen, wie ein dependency injection framework, mit dem der Zugriff auf Ihre Dienste und andere Bohnen über@Autowired
.So, die NPE ergibt sich aus Missverständnis, dass Ihre Bohnen, als logischen Teil der Ansicht verwaltet werden sollten, die von JSF (beachten Sie, dass
@ManagedProperty
würde nicht so gut funktionieren). Die bean instanziiert von JSF, sondern Ihren Dienst befindet sich im Spring-Kontext, JSF kennt der Feststellung über, so dass die Injektion nicht möglich. Auf der anderen Seite, wenn die Bohne verbleibt im Frühjahr Kontext, der Lebenszyklus und die Abhängigkeiten injiziert werden, die von Frühling.So, damit es funktioniert, markieren Sie die Bohne als
und alle, die die Voraussetzungen der Verwendung von Spring mit JSF. Konsultieren dieses hervorragende Beispiel für die Einstellungen, wenn Sie den überblick verlieren. Auf diese Weise, alle die Bohnen verwaltet werden, die bis zum Frühjahr sichtbar sein werden in JSF-views beim Anhängen EL-resolver in faces-config.xml (so dass JSF zu "sehen" Spring-Bean) und notwendigen Hörer in web.xml. Wenn Sie es so machen, werden alle Spring-beans referenziert werden können in .xhtml-Dateien und wenn Sie benötigen, um die JSF-action in der Bohne, nur gehen Sie vor und legen Sie Sie in den (Frühlings -) managed beans oder Sie implementieren entscheidend für die JSF-Schnittstellen, etc. Die integration kann nur erreicht werden, diese Weise. Natürlich können Sie auch verwenden, JSF managed beans,
@FacesConverter
und@FacesValidator
Klassen in der Anwendung als gut, nur nicht stören, Sie mit jedem anderen, aber mit zwei dependency injection-frameworks innerhalb einer Anwendung ist zumindest verwirrend.Hoffe, das hilft Ihnen beim Verständnis der situation zu verbessern.
Gibt es auch einige Probleme mit dem code würde ich den stress nicht in dieser Allgemeinen Antwort.
@ViewScoped
. Was ich Tue, als eine alternative ist der Zugriff auf die web-Anwendung Kontext mit dem servlet-Kontext von einer@ApplicationScoped
managed bean. Dann habe ich noch den Spring-Kontext in meine Anwendung Bohne, so dass ich nur Spritzen diese Bohne in meine@ViewScoped
lieben. Das ist ein Zwischenschritt, aber zumindest funktioniert es.Können Sie versuchen ManagedProperty Anmerkung zum UserDAO
Müssen Sie möglicherweise ändern dao-Vermerk, sowie
Entfernen bean Erklärung von Ihr applicationContext.xml. Wie haben Sie Anmerkungen UserDao mit der @Repository der spring container erstellen einer singleton-bean heraus. Dies sollte Ihr problem lösen.
Entfernen Sie diese aus applicationContext.xml :
<bean id="UserDAO" class="com.otv.user.dao.UserDAO">
</bean>