< f:selectItems>仅将模型的toString()显示为项目标签 [英] <f:selectItems> only shows toString() of the model as item label

查看:96
本文介绍了< f:selectItems>仅将模型的toString()显示为项目标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我面临使用转换器正确填充SelectOneMenu的问题.我遵循了几个Google参考,最后 http://balusc.blogspot.in BalusC的/2007/09/objects-in-hselectonemenu.html 链接.但是无法找出问题所在.我正在提供所有实体,托管bean和jsf代码供您考虑.

I am facing a problem to populate SelectOneMenu correctly using converter. I followed several google references and lastly http://balusc.blogspot.in/2007/09/objects-in-hselectonemenu.html link of BalusC. But could not figure out the problem. I am giving all my entity, managedbean and jsf code for your consideration.

实体:

@Entity
@Table(name = "gender")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Gender.findAll", query = "SELECT g FROM Gender g"),
    @NamedQuery(name = "Gender.findById", query = "SELECT g FROM Gender g WHERE g.id = :id"),
    @NamedQuery(name = "Gender.findByGender", query = "SELECT g FROM Gender g WHERE g.gender = :gender")})
public class Gender implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Short id;
    @Size(max = 10)
    @Column(name = "gender")
    private String gender;
    @OneToMany(mappedBy = "gender")
    private List<Patient> patientList;

    public Gender() {
    }

    public Gender(Short id) {
        this.id = id;
    }

    public Short getId() {
        return id;
    }

    public void setId(Short id) {
        this.id = id;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @XmlTransient
    public List<Patient> getPatientList() {
        return patientList;
    }

    public void setPatientList(List<Patient> patientList) {
        this.patientList = patientList;
    }

    @Override
    public int hashCode() {
        return (id != null) ? (getClass().hashCode() + id.hashCode()) : super.hashCode();
    }

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

    @Override
    public String toString() {
        return "hms.models.Gender[ id=" + id + " ]";
    }

转换器:

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

    @Inject GenderService gs;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if(value == null){
            return null;            
        }
        return gs.getGender(Integer.parseInt(value));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if(value == null) {
            return null;
        }          
        if (!(value instanceof Gender)) {
            throw new ConverterException("The value is not a valid Gender: " + value);
        }
        return ((Gender) value).getGender();
    }

}

和JSF SelectOneMenu标记:

And JSF SelectOneMenu tag:

<h:selectOneMenu id="gender" value="#{registrationBean.patient.gender}" converter="genderConverter">
                                        <f:selectItem itemValue="0" itemLabel="-- Select Gender --"  />
                                        <f:selectItems value="#{registrationBean.genderList}" />
                                    </h:selectOneMenu>

下拉列表输出类似于"hms.models.Gender[id=1]",依此类推.图片示例如下:

The dropdown output is similar to "hms.models.Gender[id=1]" and so on. Image sample has given below:

有人可以帮忙吗?预先感谢.

Can anybody help? Thanks in advance.

推荐答案

您的问题有两个方面.

首先,在输出中显示选择项标签,而不是选择项值.转换器仅影响选择项目的值,而不影响选择项目的标签.除非通过itemLabel属性另外指定,否则选择项标签默认为选择项值的toString()结果.

Firstly, in the output the select item label is being presented, not the select item value. The converter only affects the select item value, not the select item label. Unless otherwise specified via itemLabel attribute, the select item label defaults to toString() outcome of the select item value.

假设您要显示gender属性作为选择项标签,则应这样做:

Assuming that you want to display the gender property as select item label, then this should do:

<f:selectItems value="#{registrationBean.genderList}" var="gender"
    itemValue="#{gender}" itemLabel="#{gender.gender}" />

(应该说具有与类本身相同名称的属性很尴尬)

那应该解决演示文稿失败的问题.

That should fix the presentation fail.

第二,您需要将输出从Gender实例转换为其gender属性.但是,您要为输入尝试将输出的gender属性解释为id,以便找到关联的Gender实例.这没有任何意义.相应地修复转换器,以完全按照getAsObject()的要求将id放回getAsString()中.

Secondly, you're for the output converting from Gender instance to its gender property. However, you're for the input attempting to interpret the outputted gender property as an id in order to find the associated Gender instance. This doesn't make any sense. Fix the converter accordingly to give the id back in getAsString(), exactly as expected by getAsObject().

return ((Gender) value).getId().toString();

那应该解决表单提交失败的问题.

That should fix the form submit fail.

这篇关于&lt; f:selectItems&gt;仅将模型的toString()显示为项目标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆