2012-01-19 61 views
14

我想使用jsf註釋和一些彈簧 註釋將spring bean /服務注入到jsf managed bean中。 (關於jsf bean,我只想使用jsf註釋) 我不想使用註釋,如@named/@injectJSF 2使用@ManagedProperty注入Spring bean /服務並且不使用xml

我試圖在網上找到解決方案,但沒有任何運氣。

@ManagedBean 
@ViewScoped 
public class MyBean { 

    @ManagedProperty(value = "#{mySpringBean}") 
    private MySpringBean mySpringBean; 

    public void setMySpringBean(MySpringBean mySpringBean) { 
     this.mySpringBean = mySpringBean; 
    } 

    public void doSomething() { 
    //do something with mySpringBean 
    } 
} 

是這樣可以不使用XML。例如, 我不喜歡使用像

FacesContextUtils.getWebApplicationContext(context).getBean("MySpringBean"); 

faces-config.xml

<managed-bean> 
    <managed-bean-name>myBean</managed-bean-name> 
    <managed-bean-class>com.mytest.MyBean</managed-bean-class> 
    <managed-bean-scope>view</managed-bean-scope> 
    <managed-property> 
     <property-name>mySpringBean</property-name> 
     <value>#{mySpringBean}</value> 
    </managed-property> 
</managed-bean> 

是像上面可能有註釋和無 定義所有的JSF豆/性能和彈簧beans/properties for 每個bean在config xml文件中?

+0

好笑的是,我用注射的這種方法,它爲我的作品,但後來我還包括在物業注入我的'applicationContext.xml'。 Spring EL解析器似乎不適用於我注意到的ViewScoped bean。嘗試將其更改爲SessionScoped並查看屬性是否被注入。 –

+0

我想避免applicationContext.xml(我有點固執!謝謝) 但是,謝謝:) – Dimman

回答

14

如果你已經有了Spring容器,爲什麼不使用它的@Autowired註解。爲此,請按照Boni的建議更新您的faces-config.xml。這

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
</context-param> 

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

<listener> 
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
</listener> 

後這些聽衆然後添加到您的web.xml然後將這些添加到你的applicationContext.xml

<context:component-scan base-package="com.examples" /> 

現在你可以使用Spring的註解,你的bean將是這樣的:

package com.examples; 
@Component 
@Scope(value="request") 
public class MyBean { 
    @Autowired 
    private MySpringBeanClass mySpringBean; 
} 

標註您MySpringBeanClass與@Service

另請參見:

+1

如果你想在Spring中使用ViewScope,你需要編寫一個自定義的ViewScope類來實現範圍。關注該鏈接的這篇博客文章(http://cagataycivici.wordpress.com/2010/02/17/port-jsf-2-0s-viewscope-to-spring-3-0/) – Ravi

11

將這個代碼在你的faces-config.xml中

<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> 
    </application> 
</faces-config> 

然後在你的ManageBean構造函數調用;

WebApplicationContext ctx = FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance()); 
mySpringBean = ctx.getBean(MySpringBean.class); 

MySpringBean意味着你的Spring Bean類

+0

我已經這樣做了,但但我的注入bean始終爲空。 – Dimman

+0

它可以在spring bean中使用註釋完成,並且不需要在applicationContext.xml中插入它? <豆ID = 「mySpringBean」 類= 「com.mytest.MySpringBean」> 由於 – Dimman

+1

我有它與WebApplicationContext的CTX溶液工作。 我只是想知道如果我可以跳過它並使用@ManagedProperty(value =「#{mySpringBean}」) 直接 :) – Dimman

3

假設你已經在web.xml和applicationContext.xml中正確配置春天。 製作faces-config.xml中的以下條目上面給出

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

示例代碼似乎罰款。上面的條目會發生什麼情況:如果在JSF管理的bean中未找到託管屬性,將在Spring管理的bean中搜索Managed Property。你的spring bean應該有正確的註釋標記,@ManagedProperty中給出的名字應該與給予bean的默認/名稱匹配。

正如@Boni提到的那樣,它不是必需的,它是自動注入的。我已經使用了你想要的設置。

一個側面說明:由於您選擇了視圖範圍,請看看這個鏈接The benefits and pitfalls of @ViewScoped

相關問題