1

友達をリストに追加できる Web アプリを作成したいと考えています。このため、私は JSF と Java Beans を使用していますが、現在、深刻な問題がいくつかあります。

まず、フレンド クラスを作成しました。

package at.fhjoanneum.ima11.listoffriendsjsf;

import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;


@Named("friend")
@RequestScoped
public class Friend implements Serializable{

    private String nickname;
    private String firstname;
    private String lastname;

    public Friend() {
    }



 @Override
    public boolean equals(Object obj) {
    if (obj != null && obj instanceof Friend) {
    Friend other = (Friend) obj;
    return this.getNickname().equals(other.getNickname());
    }
    return false;
    }
    // getter, setter, equals, hashcode
    }

友達を保存するために、別の Bean を作成しました。

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Named;


@Named("listOfFriendsBean") @SessionScoped
public class ListOfFriendsBean implements Serializable {

    private List<Friend> listOfFriends = new ArrayList<Friend>();


    public String addFriend(Friend friend) {
        if(!listOfFriends.contains(friend)) {
            listOfFriends.add(friend);
            return "index";
        } else {
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_FATAL, "Your friend is already stored in the list!", null);
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return "index";    
        }
    }

    public List<Friend> getListOfFriends() {
        return listOfFriends;
    }

最後になりましたが、JSF ファイルを作成しました (その一部のみです。これは、友達を追加するための単なるフォームです。その上には、保存された友達を含むテーブルがあります)。

<p:panel header="Add friend">
                <h:panelGrid columns="2" columnClasses="column" cellpadding="5">
                    <p:outputLabel value="Nickname" for="nickname"/>
                    <p:inputText id="nickname" required="true" value="#{friend.nickname}" />
                    <p:outputLabel value="Firstname" for="firstname"/>
                    <p:inputText id="firstname" required="true" value="#{friend.firstname}" />
                    <p:outputLabel for="lastname" value="Lastname"/>
                    <p:inputText id="lastname" required="true" value="#{friend.lastname}" />
                </h:panelGrid>
            </p:panel>


            <p:commandButton value="Add" styleClass="ui-priority-primary" ajax="false" 
                             action="#{listOfFriendsBean.addFriend(friend)}" />

最初の友達を追加するとすべて正常に動作しますが、その後、友達が既にリストに保存されており、古い友達の値が新しい値に変更されているというエラーが表示されます。したがって、私のWebアプリはfriendの同じインスタンスを使用していると確信していますが、friendクラスのリクエストスコープを使用したため、それを取得できません。リクエストごとに友人の新しいインスタンスを作成するべきではありませんか? どうすればこれを解決できますか?

ご協力ありがとうございました!

4

3 に答える 3

0

Friend Bean の equals メソッドをオーバーライドする必要があると思います。

    package at.fhjoanneum.ima11.listoffriendsjsf;

    import java.io.Serializable;
    import javax.enterprise.context.RequestScoped;
    import javax.inject.Named;


    @Named("friend")
    @RequestScoped
    public class Friend implements Serializable{

        private String nickname;
        private String firstname;
        private String lastname;

        public Friend() {
        }
    // getter, setter, equals, hashcode

        @Override
        public boolean equals(Object obj){
            if(obj instanceof Friend && isEqual()){
               return true;
            }
            else 
                return false; 
        }

}
于 2013-04-15T17:13:00.507 に答える