0

我写的客户转换器有问题。我从转换器调用我的 DAL 并将其作为托管属性注入。当我从我的一个 ui 组件调用转换器时,一切正常;但是,当我从另一个组件调用它时,注入的 DAL 为空。如果这是一个骗局,我深表歉意,我已经到处寻找答案。

我正在使用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;
}  

}

这是两个 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. 转换器已返回null,而不是getAsObject().

根据目前提供的信息,转换器在一个页面上工作正常,但在其他页面上却不行。所以原因 1 可以安全地被划伤。遗留原因 2 和 3。

至于原因2,您需要保证<f:selectItems value="#{blast.fanlists}">在处理表单提交过程中不会返回不同的值。如果#{blast}bean 是请求范围的并且fanlists属性是基于在表单提交期间丢失的一些请求范围的变量初始化的,则可能会发生这种情况。您可以通过将 bean 放在视图范围中来修复它(并确保您没有在 getter 中执行业务逻辑)。

至于原因 3,调试器/记录器应该提供足够的线索,说明转换器是否正常工作。那么这个问题实际上已经超出了 JSF 的范围。根据提交的值返回正确的对象实例是开发人员的责任。

也可以看看:


与具体问题无关。转换器上的@FacesConverter注释是多余的。它没有在这个结构中使用。如果您使用它,则根本不会注入托管属性。另请参阅如何注入@FacesConverter?

于 2013-01-23T14:12:51.637 回答