2012-09-18 225 views
3

我正在試驗JSF和Primefaces(JSF 2.0.2,PrimeFaces 3.0.5,Spring 3.0.0)。看來我無法訪問託管bean從XHTML頁面,如@Scope(「請求」)不起作用

<h:inputText id="lastName" value="#{personalBean.personal_Basic.firstName}" label="Last Name" required="true" /> 

請求從命令鏈接的調用到bean方法,服務啓動,並返回頁面。我可以在服務器控制檯Bean中看到服務方法被執行。當我嘗試使用上面的bean屬性時,我沒有看到任何東西。不過,我能夠訪問用於會話管理用戶的會話範圍的bean。

對不起,如果這個問題太天真了。任何解決問題的輸入都非常感謝。

下面是我的代碼片段。這就是我所說的bean:

<h:form> 
    <p:commandLink id="ajax" actionListener="#{personalBean.getPersonalInfo}" style="margin-left:5px;"> 
     <h:outputText value="Personal Info" /> <br/> 
    </p:commandLink> 
</h:form> 

下面是請求作用域管理bean。

package com.test.model; 
@ManagedBean 
@Scope("request") 
public class PersonalBean implements Serializable { 

private static final long serialVersionUID = 199L; 
private Personal_Basic personal_Basic; 
private IPersonalService personalService; 

@Inject 
public PersonalBean(final IPersonalService personalService) { 
    this.personalService = personalService; 
} 
public String getPersonalInfo() { 
    System.out.println("\n\nPersonalBean#getPersonalInfo called...**"); 
    User user = null; 
    Personal_Basic personal_Basic = personalService.getPersonalBasic(); 
    this.setPersonal_Basic(personal_Basic); 
    System.out.println("personal_Basic data:"+personal_Basic); 
    System.out.println("PersonalBean#getPersonalInfo ended..."); 
    return "/page/personal.html"; 
} 
// Getters/setters for class members followed 
} 

PersonalService實現用@Service註釋。

下面是spring configuration xml的摘錄。

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop" 
    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/aop 
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <context:annotation-config/> 
    <context:component-scan base-package="com.test"/> 
................... 
................... 
</beans> 

下面是從faces-config.xml中

<?xml version="1.0"?> 
<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_0.xsd" 
       version="2.0"> 
    <application> 
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> 
     <resource-bundle> 
      <base-name>Messages</base-name> 
      <var>msg</var> 
     </resource-bundle> 
     <locale-config> 
      <default-locale>en</default-locale> 
     </locale-config> 
    </application> 
........................... 
</faces-config> 
+0

任何錯誤消息? –

+0

服務器(Tomcat 6.0)控制檯,日誌中沒有錯誤消息。 :( – bkrish

+2

@範圍與JSF沒有任何關係,它是Spring的一部分,所以爲了得到能夠回答你問題的正確的人的關注,適當地標記問題是很重要的。缺少'[spring]'標籤給你的問題 – BalusC

回答

4

<context:component-scan base-package="com.test"/>元件掃描的摘錄和登記由默認與@Component,@Repository,@Service或@Controller的所有豆。

Spring還提供對javax.annotation.ManagedBean(而不是javax.faces.bean.ManagedBean)和JSR-330標準註釋的支持,並且這些標註也由Spring掃描,但您需要將以下依賴項添加到您的項目中。

<dependency> 
    <groupId>javax.inject</groupId> 
    <artifactId>javax.inject</artifactId> 
    <version>1</version> 
</dependency> 

你可以看到所有的等效註解Spring註解here,你可以看到@Component的等效@Named和範圍使用溫泉@Scope註解,而不是javax.inject.scope提到。 所以,如果你想春天來管理應用程序中的所有豆,您可以使用@Component,@Namedjavax.annotation.ManagedBean註釋並注入它們使用@Autowired或@Inject。

對於你的問題,爲什麼用javax.faces.bean.ManagedBean註釋的bean似乎被初始化,但不起作用是因爲@BalusC提到的@Inject在JSF中不受支持,你必須使用@ManagedProperty註釋。

在這一切是如何與Spring和JSF工作的一些背景:

其實有兩個IOC容器在你的應用程序現在使用JSF和彈簧,當應用程序啓動。 首先,在faces-config.xml中配置的org.springframework.web.jsf.el.SpringBeanFacesELResolver將委派給Spring根WebApplicationContext,首先解析對Spring定義的Bean的名稱引用,然後解析底層JSF實現的默認解析器。

現在,當JSF的bean是第一次看到了它的構造,然後託管屬性通過setter方法設置,因此您可以使用@ManagedProperty註解這樣注入一個Spring bean:

package com.test.model; 
@ManagedBean 
@RequestScoped 
public class PersonalBean implements Serializable { 
@ManagedProperty(value="#{personalService}") 
private IPersonalService personalService; 
public IPersonalService getPersonalService() { 
    return personalService; 
} 

public void setPersonalService(IPersonalService personalService) { 
    this.personalService= personalService; 
} 

或您也可以手動獲取使用Spring bean的

org.springframework.web.context.support.WebApplicationContextUtils這樣的:

private Object getSpringBean(String name){ 
     WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(
       (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext()); 
     return ctx.getBean(name); 
} 

,並使用它像這樣:

Personal_Basic personal_Basic = ((IPersonalService) getSpringBean("personalService")).getPersonalBasic(); 

而不是使用兩個集裝箱在應用程序中你可以使用Spring容器通過註釋JSF豆@Component來管理所有的咖啡豆,但和有這樣沒有意義,我知道的,應該是完全可以使用Spring註釋。

參見:

+0

完美!從spring xml的ManagedBean和annotation-config。組件掃描就像一個魅力。非常感謝!:) – bkrish

+0

我做到了。但是我仍然想知道爲什麼@ManagedBean不起作用?我想我們可以將請求範圍設置爲Component。但它有什麼影響? – bkrish

+0

@bkrish,請參閱更新的答案以獲得更詳細的解釋! – Ravi

0

你不能用彈簧範圍混合@ManagedBean,你有@ManagedBean和之間做出選擇@ RequestScope或@Componenet和@Scope(「會話」)