4

これはよくあることのようですが、私はそれで迷っています。Assessment.jsf の [追加] ボタンをクリックすると発生します。とにかく、関連するセクションだと思うものを添付しました。

FWIW、デバッグ時に AssessmentType.equals() がトリガーされません。

前もって感謝します。

j_idt38:j_idt47:j_idt48: Validation Error: Value is not valid

評価.xhtml:

        <h:form>
            <h:selectOneMenu value="#{assessmentBean.assessmentField}">
                <f:selectItems value="#{assessmentBean.assessment.type.fields}" />
            </h:selectOneMenu>

            <h:commandButton value="Add" action="#{assessmentBean.doAddField}">
                <f:param name="assessmentId"
                    value="#{assessmentBean.assessment.id}" />
            </h:commandButton>
        </h:form>

評価.jsf:

<form id="j_idt38:j_idt47" name="j_idt38:j_idt47" method="post" action="/jsf-web/edit/assessment.jsf" enctype="application/x-www-form-urlencoded"> 
<input type="hidden" name="j_idt38:j_idt47" value="j_idt38:j_idt47" /> 
<select name="j_idt38:j_idt47:j_idt48" size="1">    <option value="1">Presenting Condition</option> 
    <option value="2">Problem Duration</option> 
</select> 
<script type="text/javascript" src="/jsf-web/javax.faces.resource/jsf.js.jsf?ln=javax.faces"></script>
<input type="submit" name="j_idt38:j_idt47:j_idt50" value="Add" onclick="mojarra.jsfcljs(document.getElementById('j_idt38:j_idt47'),{'j_idt38:j_idt47:j_idt50':'j_idt38:j_idt47:j_idt50','assessmentId':'1'},'');return false" /><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="3431661972220941645:6952134510589038883" autocomplete="off" /> 
</form> 

AssessmentType.java:

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;

import lombok.Data;

import org.hibernate.envers.Audited;

@Audited
@Data
@Entity
public class AssessmentType implements Comparable<AssessmentType> {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String name;

    @OneToMany( fetch=FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, targetEntity=AssessmentField.class )
    private List<AssessmentField> fields;

    @Override
    public int compareTo(final AssessmentType o) {
        return getId().compareTo(o.getId());
    }

    @Override
    public String toString() {
        return getName();
    }
}

AssessmentFieldConverter.java

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.htu.fizio.api.AssessmentFieldManager;
import com.htu.fizio.domain.AssessmentField;

@FacesConverter(forClass = AssessmentField.class)
public class AssessmentFieldConverter implements Converter {

    AssessmentFieldManager<AssessmentField> assessmentFieldManager;

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @Override
    public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
        try {
            final InitialContext ic = new InitialContext();

            assessmentFieldManager = (AssessmentFieldManager) ic.lookup("fizio/AssessmentFieldManagerImpl/local");

            return assessmentFieldManager.find(Long.valueOf(value));
        } catch (NamingException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public String getAsString(FacesContext ctx, UIComponent component, Object value) {
        return String.valueOf(((AssessmentField) value).getId());
    }
}

AssessmentBean.java

    import java.util.List;

    import javax.annotation.PostConstruct;
    import javax.ejb.EJB;
    import javax.faces.bean.ManagedBean;
    import javax.faces.bean.ManagedProperty;
    import javax.faces.bean.SessionScoped;

    import lombok.Getter;
    import lombok.Setter;

    import com.htu.fizio.api.AssessmentManager;
    import com.htu.fizio.domain.Assessment;
    import com.htu.fizio.domain.AssessmentField;
    import com.htu.fizio.domain.AssessmentFieldValue;
    import com.htu.fizio.jsf.faces.FacesUtil;

...    

@PostConstruct
public void init() {
    if (FacesUtil.containsKey("assessmentId")) {
        final Long id = Long.parseLong(FacesUtil.get("assessmentId"));

        assessment = assessmentManager.find(id);
    } else {
        assessment = new Assessment();
    }
}

    public String doAddField() {
        final AssessmentFieldValue value = new AssessmentFieldValue();

        value.setField(assessmentField);
        value.setValue("");

        assessment.getFieldValues().add(value);

        assessmentManager.save(assessment);

        return "/edit/assessment";
    }

編集:

デバッグ中にこれに気づきましたが、疑わしい可能性がありますか?:

Daemon Thread [HandshakeCompletedNotify-Thread] (Suspended (exception ConcurrentModificationException)) 
    HashMap$EntryIterator(HashMap$HashIterator<E>).nextEntry() line: 793    
    HashMap$EntryIterator.next() line: 834  
    HashMap$EntryIterator.next() line: 832  
    SSLSocketImpl$NotifyHandshakeThread.run() line: 2214    
4

3 に答える 3

15

検証エラー: 値が無効です

要するに、このエラーは、選択されたアイテムがリストで使用可能などのアイテムとも一致しないことを意味します。つまり、選択されたアイテムの値によって表されるオブジェクトは、使用可能な選択アイテムのいずれかで呼び出し時に返さtrueれたことはありません。equals()

この問題の原因は 2 つだけです。

  1. 問題のオブジェクト タイプのequals()メソッドが壊れています。
  2. アイテムのリストの内容は、フォーム送信要求の検証フェーズ中と、フォームを表示する最初の要求のレンダリング レスポンス フェーズ中とでは異なります。

コメントによると、最初のものは適切に実装されているように見えるため、残された唯一の原因は2番目のものです。ゲッター メソッドでビジネス ロジックを実行していないと仮定すると、簡単なテストは#{assessmentBean}、セッション スコープに配置することです。それが機能する場合、選択項目のリストのデータ (事前) ロード ロジックは間違いなく間違っています。

于 2011-06-13T11:30:52.470 に答える
5

コンバーターがAssessmentTypeの文字列表現をオブジェクトに変換した後、JSFは既存の値(assessmentBean.assessment.type.fields)を繰り返し処理し、この最近変換されたオブジェクトを既存のすべてのオブジェクトと比較するため、検証は失敗します。

あなたはAssessmentTypeを実装しなかったのでObject#equals、デフォルトでオブジェクトID比較(大まかに言えば、オブジェクトのメモリアドレス)になりますが、もちろん失敗します。

したがって、解決策は、を実装するか、コンバーターにからではなくからObject#equalsオブジェクトを取得させることです。assessmentBean.assessment.type.fieldsAssessmentTypeManager

于 2011-06-12T20:19:51.027 に答える
2

私はこれを解決したと思います、少なくとも、次のエラーに移りました!

大量のコードを投稿したにもかかわらず、複数のネストされたフォームタグが含まれる完全なxhtmlは投稿しませんでした。1つの形式だけで、assessmentIdパラメーターを渡すことができるようです。これにより、AssessmentBeanは、評価タイプのAssessmentFieldsのリストに正しく入力できます。

すべての助けをありがとう。

于 2011-06-14T22:29:45.473 に答える