0

nameという文字列プロパティを持つUserという管理対象Beanがあります。

public class User {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

Userタイプのプロパティを持ち、ユーザーリストにユーザーを追加できるUserManagerという別のマネージドBeanがあります。

public class UserManager {
    private List<User> userList = new ArrayList<User>();
    private User user;
    public User getUser() {
        return this.user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public String addUser() {
        userList.add(user);
        return "_USERADDED";
    }
}

ユーザーを追加するJSFページは次のようになります。

<h:form>
    <h:inputText value="#{userManager.user.name}"/>
    <h:commandButton value="Add User" action="#{userManager.addUser}"/>
</h:form>

私が抱えている問題は、ページを実行して[ユーザーの追加]ボタンをクリックすると、次のエラーが発生することです。

adduser.xhtml @ 11,50 value = "#{userManager.user.name}":Target Unreachable、'null' return null

このエラーは、UserManagerのユーザープロパティがnullであり、プロパティを設定するためにアクセスしようとしていることが原因であると想定しています。

UserManagerを変更し、ユーザープロパティを初期化すると、これを機能させることができます。

private User user = new User();

私の質問は、これはプロパティを初期化する正しい方法ですか、それともJSFファイルや構成ファイル内から実行できますか?

4

1 に答える 1

3

はい、あなたはそれを自分で作成することになっています。JSF / ELは、ネストされたプロパティを自動作成しません。標準的なアプローチは、これにを使用すること@PostConstructです。

@ManagedBean
@RequestScoped
public class UserManager {

    private List<User> userList = new ArrayList<User>();
    private User user;

    @PostConstruct
    public void init() { 
        user = new User();
    }

    public String addUser() {
        userList.add(user);
        return "_USERADDED";
    }

    public User getUser() {
        return user;
    }

}

セッターはJSF/ELで使用されないため、省略したことに注意してください。私はまだそこで何userListをしているのだろうか、それはそこに属していない。これは単なるテストのスタブだと思います。その場合は、によって注入するアプリケーションまたはセッションスコープのBeanの方がおそらく良いでしょう@ManagedProperty

于 2013-01-23T12:22:37.640 に答える