1

CDIでJSF 2とGlassFish Server 4を使用しています(javax.enterprise.contextをインポートしています...)。SessionBean A を別の SessionBean B に注入しようとしていますが、2 番目の http 要求で B にアクセスしようとすると、もう存在しません。代わりに、B の新しいインスタンスが作成されます。したがって、どの Bean にも情報はありません。これが私のコードの一部です:

Bean A: (この Bean はすべてのログイン情報を保持します)

@Named("login")
@SessionScoped
public class LoginBean implements Serializable {

    private Farmer aFarmer;
    private Admin anAdmin;
    private User loginInfo;
    private int tries;
    private boolean loggedIn;
    private int accessLvl;

    /**
     * Constructor for a LoginBean, setting default values
     */
    public LoginBean() {

    }

    @PostConstruct
    public void init() {
        loginInfo = new User();
        tries = 0;
        loggedIn = false;
    }

Bean B: (この Bean はすべてのファーマー情報を保持し、ファーマーでのアクションに使用されます)

@Named("farmer")
@SessionScoped
public class FarmerController implements Serializable{

    private @Inject LoginBean login;
    private Farmer theFarmer;
    private ArrayList<Integer> dates;
    private ArrayList<Integer> months;
    private ArrayList<Integer> years;
    private int date; //date place holder
    private int month; //month place holder
    private int year; //year place holder
    private String response; //confirmation response
    private String confPwd;
    private String oldPwd;
    private String email;
    private String password;

    /**
     * Default constructor for FarmerController, sets standard calendar values
     */
    public FarmerController() {

    }

    @PostConstruct
    public void init() {
        theFarmer = new Farmer();

        //standard values for dates
        dates = new ArrayList<>();
        for (int i = 0; i < 31; i++) {
            dates.add(i+1);
        }
        //standard values for months
        months = new ArrayList<>();
        for (int i = 0; i < 12; i++) {
            months.add(i+1);
        }
        //standard values for year, current year - 100
        Calendar cal = new GregorianCalendar();
        int tempyear = cal.get(Calendar.YEAR);
        years = new ArrayList<>();
        for (int i = 0, j = tempyear; i < 100 && j > tempyear - 100; i++, j--) {
            years.add(j);
        }

        //check when bean is constructed
        System.out.println("FarmerController constructed");
    }

index.xhtml: (これは私がログインする場所であり、これは正常に動作します)

<h:form class="form-horizontal form-group">
     <fieldset>
          <div class="input-group">
               <h:inputText id="username" class="form-control" p:placeholder="Brukernavn/Email" value="#{farmer.email}"/>
          </div>
          <div class="input-group">
               <h:inputSecret id="password" class="form-control" p:placeholder="Passord" value="#{farmer.password}"/>
          </div>
          <div class="input-group">
               <h:commandButton id="signin" value="Logg inn" class="btn btn-success" action="#{farmer.login()}"/>
          </div>
     </fieldset>
</h:form>

ログインすると、すべてが正しく表示されている 2 番目の .xhtml ページが表示されます。ただし、さらにこの FarmerController を参照する別のページに移動すると、ログインからの情報をまったく持たない新しい Bean が作成されます。これはなぜですか? 私は何を間違っていますか?

更新: 2 つの Bean をマージしようとしました (すべてのアクションに 1 つだけを使用)。ログイン後に SessionScoped Bean が破棄されるという同じ問題があります。

4

1 に答える 1

1

多くのデバッグの後、私は最終的に自分のエラーを見つけました。Beanのインジェクションとは関係ありませんが、 action 属性を使用して<a>いないため、レンダリング中に logout メソッドを持つタグが呼び出されました。タグのhref 属性は結果の文字列をすぐに取得したいので、タグにあったメソッドを実行すると思います。今私は知っている。愚かな間違い...commandLink<a>

于 2013-11-03T19:04:23.650 に答える