0

私は特にJEE6とJSFにかなり慣れていないので、これを実行するための知識が不足していることを知っています。私は2日以上仕事に就こうとしていました-それは絶望的です...

私の問題は何ですか: ユーザー、スキル、レベルがあります。たとえば、「フランク (料理人)」にはレベル「エキスパート」のスキル「料理」があります。そのため、ユーザーが自分のスキルを管理できるフォームを作成しようとしています。レベルに応じたスキルをなんとか表示できる。レベルは、SelectOneMenu の選択された値です。値を変更してフォームを送信すると、単に何もせず、理由がわかりません:-(

これまでの私のコード:

profile.xhtml

<h5>General skills</h5>
<h:panelGroup>
    <h:form>
        <h:dataTable value="#{userBean.userskills}" var="userskill">
            <h:column>
                <f:facet name="header">Skill</f:facet>
                <span><h:outputText value="#{userskill.skill.description}" /></span>
            </h:column>

            <h:column>
                <f:facet name="header">Level</f:facet>
                <span>
                    <h:selectOneMenu value="#{userskill.level}" >
                        <f:selectItem itemValue="#{null}"
                                      itemLabel="#{msg.ChooseOption}"
                                      noSelectionOption="true" />
                        <f:selectItems value="#{userskill.skill.levels}"
                                       var="level"
                                       itemValue="#{level}"
                                       itemLabel="#{level.description}" />
                        <f:converter converterId="levelConverter" />
                    </h:selectOneMenu>
                </span>
            </h:column>
        </h:dataTable>
        <h:commandButton value="#{msg.Save}" 
                         action="#{userBean.testAction}" />
    </h:form>
</h:panelGroup>

UserBean.java

@ManagedBean
@SessionScoped
public class UserBean implements Serializable {
    private static final long serialVersionUID = 1L;

    private User user;

    @ManagedProperty(value="#{authBean}")

    private AuthenticationBean authBean;

    @EJB IUserDao userDao;
    @EJB ICategoryDao categoryDao;
    @EJB IUserSkillLevelDao uskDao;

    List< UserSkillLevel > userskills;

    public User getUser() {
         return user;
    }

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

    public void setAuthBean(AuthenticationBean authBean) {
         this.authBean = authBean;
    }

    public List<UserSkillLevel> getUserskills() {
         return userskills;
    }

    public void setUserskills(List<UserSkillLevel> userskills) {
         this.userskills = userskills;
    }

    public String getProfile(Long userId) {
         // is called when clicking on the "Show user profile" link on an other page
         User auth_user = this.authBean.getUser();
         if ( auth_user.getId() == userId ) {
             this.user = auth_user;
         } else {
             this.user = userDao.findById(userId);
         }

         this.userskills = findUserskills(null, false);

         return "/pages/profile?faces-redirect=true";
    }

    public List< UserSkillLevel > findUserskills(Category category, boolean skillIsWithStandardLevelSet) {
         if ( category == null ) {
             Map<String, Object> parameters = new HashMap<String, Object>();
             parameters.put("description", "General");
             category = categoryDao.findOneByConditions(Category.FIND_BY_DESCRIPTION, parameters);
         }
         return uskDao.findByUserAndCategory(this.user, category, skillIsWithStandardLevelSet);
    }

    public String testAction() {
        System.out.println("-------- worked --------");
        return "";
    }
}

それはすべて正常に動作します。(DB からの) レベルは起動時に表示され、コンバーターはその逆の変換を行っており、SelectOneMenu にはそのスキルに指定されたレベルが含まれています。

自動生成された SelectOneMenus が原因で、commandButton が機能していないと思います。私は正しいですか?userBean.userskills.levelコードをデバッグすると、初期値からnullに変更されたことがわかりましたが、変更後に選択した値が含まれているかどうかわかりませんでした。SelectOneMenu を削除するとすぐに、commandButton がtestAction意図したとおりに呼び出されます。

私は何を間違っていますか?私は何かが欠けていますが、何がわかりません:-(私が望むものを達成するためのより簡単な方法はありますか?さらに:プレーンなJSFに固執する必要があります。つまり、Primefaces、Omnifacesなどは使用しません.

こんにちは、ステフィ

- アップデート -

を追加したh:messageところSelectOneMenu、「値が無効です」というエラーが発生しました。なぜそれが表示されるのかを理解しようとしています...

- アップデート -

IT'S WORKING ;-) 私のように絶望している人のために: 私は自分のエンティティに equals メソッドを実装するのを忘れていました!!!

4

0 に答える 0