2013-10-14 77 views
1

我有一些麻煩。 類具有@Named工作:@ManagedBean註釋不起作用,但@Named作品

@Named 
@SessionScoped 
public class UserBean { 

@Autowired 
UserBo userBo; 

public void setUserBo(UserBo userBo) { 
    this.userBo = userBo; 
} 

public String printMsgFromSpring() { 
    return userBo.getMessage(); 
} 

} 

但是這是行不通的,併產生錯誤:

javax.servlet.ServletException javax.faces.webapp.FacesServlet.service(FacesServlet.java:606) 根源 顯示java.lang.NullPointerException com.mkyong.UserBean.printMsgFromSpring(UserBean.java:24)

@ManagedBean 
@SessionScoped 
public class UserBean { 

@Autowired 
UserBo userBo; 

public void setUserBo(UserBo userBo) { 
    this.userBo = userBo; 
} 

public String printMsgFromSpring() { 
    return userBo.getMessage(); 
} 

} 

XHTML頁面:

<?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"> 
    <html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html"> 

<h:body> 

    <h1>JSF 2.0 + Spring Example</h1> 

    #{userBean.printMsgFromSpring()} 


</h:body> 

faces-config.xml中:

<?xml version="1.0" encoding="UTF-8"?> 
    <faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd" 
version="2.1"> 

<application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
</application> 

    </faces-config> 

服務類:

@Named 
public class UserBoImpl implements UserBo{ 

    public String getMessage() { 
     return "JSF 2 + Spring Integration"; 

    } 

} 

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
id="WebApp_ID" version="2.5"> 

    <display-name>JavaServerFaces</display-name> 

     <!-- Add Support for Spring --> 
    <listener> 
     <listener-class> 
     org.springframework.web.context.ContextLoaderListener 
     </listener-class> 
    </listener> 
    <listener> 
     <listener-class> 
     org.springframework.web.context.request.RequestContextListener 
     </listener-class> 
    </listener> 

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

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

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

    </web-app> 

的applicationContext.xml:

 <beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
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.1.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 

    <context:component-scan base-package="com.mkyong" /> 
    </beans> 
+0

請發表您的Spring上下文。 –

+0

Thx,我將applicationContext.xml添加到我的文章 – MeetJoeBlack

回答

1

JSF不會處理@Autowired。此時應更換與@ManagedProperty如下面的例子:

@ManagedProperty(value="#{userBoSpringName}") 
    UserBo userBo; 

這裏userBoSpringName應該對應於你的Spring上下文文件中bean的名字。 此選項僅適用於JSF受管Bean。

隨着JSF 2.2,你也可以使用@Inject在JSF管理bean來進行資源注入

+0

Big thx,我嘗試使用Inject註解,但不知道它只在JSF 2.2中有效。 另外我嘗試使用組件註釋而不是ManagedBean,並且都工作。 – MeetJoeBlack

0

你做了一些假設,我認爲是錯誤的。 Spring可以讀取@NamedInject註釋,但我懷疑你的JSF DI容器可以讀取Autowired註釋。在這種情況下

@Named 
@SessionScoped 
public class UserBean { 

    @Autowired 
    UserBo userBo; 

    public void setUserBo(UserBo userBo) { 
     this.userBo = userBo; 
    } 

    public String printMsgFromSpring() { 
     return userBo.getMessage(); 
    } 
} 

我相信春天創造(因爲@Named)一UserBean實例,並注入UserBo豆(也來自一個@Named類)。 Spring忽略SessionScoped

在這種情況下,然而,

@ManagedBean 
@SessionScoped 
public class UserBean { 
    @Autowired 
    UserBo userBo; 

    public void setUserBo(UserBo userBo) { 
     this.userBo = userBo; 
    } 

    public String printMsgFromSpring() { 
     return userBo.getMessage(); 
    } 
} 

我相信你的JSF容器創建這個bean,但不知道是什麼@Autowired是如此不處理它,它忽略它。

如果您向我們展示了您的Spring上下文配置以及您期望上述bean來自哪裏,我的回答會更加清晰。

+0

JSF不處理Spring批註,因此此方法將失敗。通常,您將Spring配置爲處理JSF託管的Bean,或停止使用Spring並移至CDI以解決此問題。 –

+0

@LuiggiMendoza是的,Spring知道並處理'@ Named'就好像它是'@ Component'一樣。它與'@ SessionScoped'無關。另一方面,JSF不知道'@ Autowired',所以這個字段保持爲null。 –