【问题标题】:Facelet selectOneMenu with POJOs and converter problem带有 POJO 和转换器问题的 Facelet selectOneMenu
【发布时间】:2011-01-30 20:03:09
【问题描述】:

我想要一个带有公式和下拉菜单的 facelet 页面。通过下拉菜单,用户应该选择 Lieferant 类型的 POJO:

public class Lieferant extends AbstractPersistentWarenwirtschaftsObject {

    private String firma;

    public Lieferant(WarenwirtschaftDatabaseLayer database, String firma) {
        this(database, null, firma);
    }

    public Lieferant(WarenwirtschaftDatabaseLayer database, Long primaryKey, String firma) {
        super(database, primaryKey);
        this.firma = firma;
    }

    public String getFirma() {
        return firma;
    }

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

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((firma == null) ? 0 : firma.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Lieferant other = (Lieferant) obj;
        if (firma == null) {
            if (other.firma != null)
                return false;
        } else if (!firma.equals(other.firma))
            return false;
        return true;
    }

}

这是我写的facelet代码:

<h:selectOneMenu> 

标签。此标记应显示 Lieferant 类型的 POJO(不是 bean)列表。这是facelet代码:

<h:selectOneMenu id="lieferant" value="#{lieferantenBestellungBackingBean.lieferant}">
 <f:selectItems var="lieferant" value="#{lieferantenBackingBean.lieferanten}" itemLabel="#{lieferant.firma}" itemValue="#{lieferant.primaryKey}" />
 <f:converter converterId="LieferantConverter" />
</h:selectOneMenu>

这里是引用的托管支持 bean

@ManagedBean
@RequestScoped
public class LieferantenBackingBean extends AbstractWarenwirtschaftsBackingBean {

    private List<Lieferant> lieferanten;

    public List<Lieferant> getLieferanten() {
        if (lieferanten == null) {
            lieferanten = getApplication().getLieferanten();
        }
        return lieferanten;
    }

}

据我所知,我需要一个自定义转换器来交换 Lieferant 对象的 POJO 和字符串表示。下面是转换器的样子:

@FacesConverter(value="LieferantConverter")
public class LieferantConverter implements Converter {

 @Override
 public Object getAsObject(FacesContext context, UIComponent component, String value) {
  long primaryKey = Long.parseLong(value);
  WarenwirtschaftApplicationLayer application = WarenwirtschaftApplication.getInstance();
  Lieferant lieferant = application.getLieferant(primaryKey);
  return lieferant;
 }

 @Override
 public String getAsString(FacesContext context, UIComponent component, Object value) {
  return value.toString();
 }

}

页面加载没有任何错误。当我填写公式并提交时,页面上显示错误消息:

Bestellung:lieferantenBestellungForm:lieferant: Validierungsfehler: Wert ist keine gültige Auswahl
translated: validation error: value is not a valid selection

不幸的是,它没有说明它在谈论哪个值。转换器似乎工作正常。

我找到了这个similar question from stackoverflow 和这个 article about selectOneMenu and converters,但我无法在我的代码中找到问题。为什么是

List<SelectItem> 

在第二个链接的示例中使用。给我同样的错误。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 接下来几天会做。

标签: jsf facelets converter selectonemenu


【解决方案1】:

验证错误:值不是有效选择

此错误表示所选项目与列表中的任何所选项目都不匹配。在您的情况下,这可能有两个原因:Object#equals() 执行错误,或者&lt;f:selectItems&gt; 后面的 getter 在后续请求(提交表单期间)中返回的列表与初始请求期间(之前在选择值期间提交表单)。

排除一个或另一个:您可以使用“plain vanilla”测试用例轻松测试Object#equals(),并且可以通过将 bean 置于会话范围内来测试列表的一致性。

需要明确的是,您的转换器看起来不错,而且似乎工作正常(否则您将无法收到此类错误消息;因此转换步骤已成功完成)。

【讨论】:

  • 感谢您的回答。同时我自己修好了。
【解决方案2】:

我确信转换器工作正常,但最终错误出在转换器中。也许这发生在几个小时的调试过程中。这是转换器的固定 getAsString 方法。否

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value != null && value instanceof Lieferant) {
        Lieferant lieferant = (Lieferant) value;
        return "" + lieferant.getPrimaryKey();
    }
    return "";
}

现在它返回primaryKey,用作selectOneMenu 列表的值。此外,我从 selectItems 标记更改了此属性:

 itemValue="#{lieferant}"

现在我不确定最后一次更改是否必要。但是现在副官已经正确转换了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 2013-04-10
    • 2012-12-09
    • 2012-08-25
    • 2013-12-04
    • 2013-07-18
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多