3

私は JSF と Primefaces (JSF 2.0.2、PrimeFaces 3.0.5、Spring 3.0.0) を試しています。次のような xhtml ページからマネージド Bean にアクセスできないようです。

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

リクエストは、コマンド リンクの呼び出しから 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 構成 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>
4

2 に答える 2

4

この<context:component-scan base-package="com.test"/>要素は、デフォルトで @Component、@Repository、@Service、または @Controller のアノテーションが付けられたすべての Bean をスキャンして登録します。

javax.annotation.ManagedBeanSpring は(not ) および JSR-330 標準アノテーションのサポートも提供しjavax.faces.bean.ManagedBean、これらも Spring によってスキャンされますが、プロジェクトに次の依存関係を追加する必要があります。

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

@Component に相当するものは @Named であり、スコープには前述の代わりに Springs @Scope アノテーションを使用することがわかるため、Spring アノテーションに相当するすべてのアノテーションをここjavax.inject.scopeで見ることができます。したがって、 Springでアプリケーション内のすべての Beanを管理したい場合は@Component、 、@Namedおよびjavax.annotation.ManagedBeanアノテーションを使用し、@Autowired または @Inject を使用してそれらを注入できます。

そして、アノテーションが付けられた Beanjavax.faces.bean.ManagedBeanが初期化されているように見えるのに機能しない理由は、@BalusC で述べたように、@Inject が JSF でサポートされていないため、@ManagedProperty アノテーションを使用する必要があるためです。

Spring と JSF ですべてがどのように機能するかについての簡単な背景:

実際には、アプリケーションの起動時に、JSF と Spring を使用してアプリケーションに 2 つの IOC コンテナーが存在します。最初に、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();

ただし、アプリケーションで 2 つのコンテナーを使用する代わりに、Spring コンテナーを使用して、@Component で JSF Bean にアノテーションを付けることですべての Bean を管理することができます。Spring アノテーションを使用しても問題ないことを認識しており、まったく問題ないはずです。

以下も参照してください。

于 2012-09-18T14:40:05.387 に答える