0

私が作成したカスタマー コンバーターに問題があります。コンバーターから DAL を呼び出し、管理プロパティとして挿入しています。UI コンポーネントの 1 つからコンバーターを呼び出すと、すべて正常に動作します。ただし、別のコンポーネントから呼び出すと、挿入された DAL は null です。これがだまされている場合はお詫び申し上げます。答えを見つけるためにあちこちを見ました。

私はprimefaces 3.5を使用しています。

コンバーターは次のとおりです。

@ManagedBean(name = "fanlistConverter")
public class FanlistConverter implements Converter, Serializable {
private  List<Fanlist> fanlist; 
@ManagedProperty(value="#{dAL}")
private DAL dAL;
private static Session session;


public FanlistConverter(){

} 

@PostConstruct
public void init(){
    session  = dAL.getSession();

}




public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {  
    if (!submittedValue.equals(null) &&  !submittedValue.equals("null")) {  
        Fanlist fanlist = new Fanlist();

        try {  

                fanlist = (Fanlist)session.get(Fanlist.class, UUID.fromString(submittedValue));


            } catch(NumberFormatException exception) {  
                System.out.println("error: " + exception.getMessage());
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid player"));  
            }catch(Exception e){
                System.out.println("error get as Object: " + e.getMessage());

            }


    } 

   return  fanlist; 


}  

 public String getAsString(FacesContext facesContext, UIComponent component, Object value) {  
        if (value == null || value.equals("")) {  
            return "";  
        } else {  
            return String.valueOf(((Fanlist) value).getId());  
        }  
    }   



public DAL getdAL() {
    return dAL;
}

public void setdAL(DAL dAL) {
    this.dAL = dAL;
}  

}

ここに2つのUIコンポーネントがあります

これは機能します:

                <p:panelGrid columns="3">
                    <p:outputLabel for="fanlist" value="Subscription Opt-In List    " />
                    <p:autoComplete id="fanlist" dropdown="true"
                        value="#{campaignWizard.selectedList}"
                        completeMethod="#{campaignWizard.complete}" var="f"
                        itemLabel="#{f.name}" itemValue="#{f}" converter="#{fanlistConverter}" />
                    <p:commandLink value="Add List"
                        actionListener="#{campaignWizard.addFanList}" update=":formbox2"
                        ajax="false" />
                </p:panelGrid>

これは機能しません

        <p:selectManyMenu id="fanlist2" value="#{blast.selectedLists}"
                    var="fl" showCheckbox="true" converter="#{fanlistConverter}"
                    style="width:250px;height:100px">
                    <f:selectItems value="#{blast.fanlists}" var="fanl"
                        itemLabel="#{fanl.name}" itemValue="#{fanl}" />
                    <p:column>
                        Name: #{fl.name} 
                        </p:column>
                    <p:column>
                        Size: #{fl.name}
                        </p:column>
                </p:selectManyMenu>




@ManagedBean(name = "blast")
@ViewScoped
public class BlastBean implements Serializable {
@ManagedProperty(value="#{globalVars}")
private GlobalVars globalVars; 

@ManagedProperty(value="#{dAL}")
private DAL dAL;

@ManagedProperty(value="#{messaging}")
private Messaging messaging; 

private User u; 
private Blast blast;
private List<Fanlist> fanlists; 
private List<Fanlist> selectedLists;
private List<Fanlisttoparent> fltops = new ArrayList<Fanlisttoparent>();

    public  BlastBean(){


}

@PostConstruct
public void init(){

    fetchData();


}

public void fetchData(){
    u = globalVars.getUser();
    blast = new Blast();
    fanlists = dAL.query("FROM Fanlist where client.id ='" + globalVars.getUser().getClient().getId() + "'");

}   

...

public String sendBlast(){
    System.out.println("blast:" + blast.getMessage());
    dAL.upsert(blast);
    final List<String> phoneNumbers = new ArrayList<String>(); 

    List<Profile> profiles = new ArrayList<Profile>(); 
    for(Fanlist fl: selectedLists){
        Set<Fantolist> fantolist = fl.getFantolists();
        for(Fantolist ftol: fantolist){
            profiles.add(ftol.getFanprofile().getProfile());
        }

        for(Profile p: profiles){
            phoneNumbers.add("+1"+ p.getPhonenumber());
        }

    }



...
4

1 に答える 1

1

まず、正確にValidation Error: Value is not validいつ発生するかを理解する必要があります。このエラーはequals()、現在選択されているアイテムのテストがtrue、現在使用可能なアイテムのいずれにも返されなかった場合に発生します。

したがって、このエラーには技術的に 2 つの原因があります。

  1. アイテム タイプのequals()メソッドが見つからないか壊れています。

  2. 現在利用可能なアイテムのリストは、最初の要求と比較して互換性を欠くように変更されています。

    コンバーターが関係している場合は、3 つ目の原因があります。

  3. コンバーターはnull、目的のオブジェクトの代わりにを返しましたgetAsObject()

これまでに提供された情報に基づいて、コンバーターは 1 つのページでは正常に動作しますが、他のページでは動作しません。したがって、原因 1 は安全にスクラッチできます。取り残された原因 2 と 3。

<f:selectItems value="#{blast.fanlists}">原因 2 については、フォーム送信の処理中に が異なる値を返さないことを保証する必要があります。これは、#{blast}Bean がリクエスト スコープでありfanlists、フォームの送信中に失われたリクエスト スコープ変数に基づいてプロパティが初期化されている場合に発生する可能性があります。Bean をビュー スコープに配置することで修正できます (そして、getter でビジネス ロジックを実行していないことを確認します)。

原因 3 については、デバッガー/ロガーは、コンバーターが適切に機能しているかどうかについて十分な手がかりを提供する必要があります。この問題は、実際には JSF の範囲を超えています。送信された値に基づいて適切なオブジェクト インスタンスを返すのは、開発者の責任です。

以下も参照してください。


具体的な問題とは無関係。@FacesConverterコンバーターの注釈は不要です。このコンストラクトでは使用されていません。これを使用していた場合、管理プロパティはまったく挿入されませんでした。とりわけ@FacesConverter にどのように注入できますか?も参照してください。

于 2013-01-23T14:12:51.637 に答える