2

私はJSFにまったく慣れておらず、さまざまな考え方に実際に「慣れていない」ので、何が基本であるかに苦労しています。

セッション Bean である User クラスがあるとします。

Factoryなどの10000個のオブジェクトのコントローラーがあり、それらの一部を「ロック済み」として設定できる必要があるとしましょう。この場合、「ロック済み」フィールドはもうnullにならず、「LockedItem」を参照します。物体。

これは、私が物事を機能させることができない場所です: LockedItem をインスタンス化すると、現在ログインしているユーザーを参照することになっています。

@managedproperty でインジェクションを試みましたが、LockedItem.constructor では null であり (これは正常だと思います)、@PostConstruct メソッドで試しましたが、そのメソッドは呼び出されません (なぜですか?マネージド Bean にしても...オブジェクトが「.xhtml」によって作成されたときにのみ、ポストコンストラクトメソッドが呼び出されますか?)または、ユーザーを静的にするなど、「java se」トリックを使用する必要がありますか?


@PostConstruct が呼び出されない理由を明確にするコード (「Seat」の 1 つ) :

.xhtml

<h:outputLabel id="user" value="Hello #{user.name}" />
<h:outputLabel id="car" value="you have #{car.brand}" />

ユーザー

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class User implements Serializable {
    private String name ;

    public User()
    {
        name = "toto"; 
        System.out.println("User constructor");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


}

package test;

import java.io.Serializable;

import javax.faces.bean.ManagedBean;

@ManagedBean
public class Car implements Serializable {
    private String brand ;
    private Seat seat ;

    public Car()
    {
        brand = "audi" ;
        seat = new Seat();
        System.out.println("Car constructor") ;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }


}

シート

package test;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean
public class Seat implements Serializable {
    private int nb ;
    private String userName ;

    @ManagedProperty("#{user}")
    private User user ;

    public Seat()
    {
        nb = 4 ;
        userName="na";
        System.out.println("! Seat constructor ") ;
    }

    @PostConstruct
    public void init()
    {
        System.out.println("!! Seat postconstruct : "+user.getName());
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public int getNb() {
        return nb;
    }

    public void setNb(int nb) {
        this.nb = nb;
    }
}

ありがとう !

4

1 に答える 1

5

それ@PostConstructが正しい方法です。

new演算子を使用して自分でBeanをインスタンス化する場合は呼び出されません(明らかに)。このようにELコンテキストで初めて参照されるときはいつでも、JSFがBean自体をインスタンス化して管理する場合にのみ呼び出されます#{bean}。これは実際、通常はビュー側で発生しますが、モデル/コントローラー側@ManagedProperty("#{bean}")でもまたはによって発生する可能性がありApplication#evaluateExpressionGet()ます。

絶対にUser静的にしないでください。セッション全体ではなく、アプリケーション全体で共有されます。

別の方法は、currentUserをコンストラクター引数として渡すか、初期化メソッドを自分LockedItemで呼び出すことです。そのクラスが正当なJSFバッキングBeanをまったく表していないかどうかを確認してください。

于 2012-09-07T15:07:17.427 に答える