簡體   English   中英

Primefaces selectOneMenu轉換器已調用但不起作用

[英]Primefaces selectOneMenu converter called but not working

我查看了thisthis等其他問題, 問題是調用了convert,但是selectOneMenu的值沒有改變 我的實體類已生成,並且具有等於hashCode的值,並且我想不對其進行任何更改-如果重新生成它,則所有更改都將丟失(解決方法是更改​​實體類的toString)。

XHTML代碼片段:

<p:selectOneMenu id="defid" 
                 value="#{abcController.selected.defid}"
                 converter="defConverter">

轉換器:

@FacesConverter("defConverter")
public class DefConverter implements Converter
{
    private static final Logger LOG = Logger.getLogger(DefConverter.class.getName());
    @EJB
    private DefFacade defFacade;

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string)
    {
        LOG.info("getAsObject: " + string);
        try
        {
            return defFacade.findWithNFieldsWithValue("name", string, "=").get(0);
        }
        catch (Exception ex)
        {
            LOG.log(Level.SEVERE, "Error while fetching Def for " + string, ex);
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object obj)
    {
        LOG.info("getAsString obj class: " + obj.getClass().getName());
        if(obj instanceof Def)
        {
            Def def = (Def)obj;
            LOG.info("getAsString def name: " + def.getName());
            return def.getName();
        }
        else
        {
            StringBuilder sbError = new StringBuilder("The object of class ");
            sbError.append(obj.getClass().getName()).append(" is not of Def");
            throw new ClassCastException(sbError.toString());
        }
    }
}

實體類被截斷(生成):

...
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "defid")
private Long defid;
...

@Override
public int hashCode()
{
    int hash = 0;
    hash += (defid != null ? defid.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object)
{
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Def))
    {
        return false;
    }
    Def other = (Def) object;
    if ((this.defid == null && other.defid != null) || (this.defid != null && !this.defid.equals(other.defid)))
    {
        return false;
    }
    return true;
}

頁面加載后,我可以看到以下日志語句:

getAsString obj class: com.xyz.Def
getAsString def name: Name 1
getAsString obj class: com.xyz.Def
getAsString def name: Name 2
getAsString obj class: com.xyz.Def
getAsString def name: Name 3

因此,轉換器將被調用並返回正確的值,但在頁面上仍為com.xyz.Def [defid = 1] (向下下拉並正常顯示)

該轉換器似乎正在運行,但是您沒有發布整個<p:selectOneMenu>代碼,尤其是<f:selectItems> 它應該看起來像這樣

<p:selectOneMenu id="defid" 
                 value="#{abcController.selected.defid}"
                 converter="defConverter">
    <f:selectItems value="#{abcController.defs}" var="def"
                       itemLabel="#{def.name}" itemValue="#{def.defId}" />
</p:selectOneMenu>

itemLabel負責打印顯示的值。

試試下面的代碼

<p:selectOneMenu id="defid" value="#{abcController.selected.def}"
             converter="defConverter">
   <f:selectItems value="#{abcController.defs}" var="def" 
        itemValue="#{def}" itemLabel="#{def.name}" />       
</p:selectOneMenu>

Converter用於在復雜的Java對象和String表示形式之間進行轉換。 為此,您需要將整個def對象指定為item值。 您還應確保#{abcController.selected.def}引用的是def屬性,而不是某些表示def ID的Long屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM