<f:selectitems>仅将模型的toString()显示为项目标签</f:selectitems>

时间:2014-09-16 09:16:39

标签: jsf converter selectonemenu

我正面临使用转换器正确填充SelectOneMenu的问题。我关注了几个谷歌参考和最后的http://balusc.blogspot.in/2007/09/objects-in-hselectonemenu.html BalusC链接。但无法弄清楚问题。我将提供所有实体,managedbean和jsf代码供您考虑。

实体:

@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标签:

<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]”,依此类推。图片样本如下:

enter image description here

有人可以帮忙吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

你的问题是双重的。

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

假设您要将gender属性显示为选择项标签,那么应该这样做:

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

(应该说拥有一个与类本身同名的属性非常尴尬)

应该修复演示文稿失败。

其次,您要将输出从Gender实例转换为其gender属性。但是,您要输入尝试将输出的gender属性解释为id,以便找到关联的Gender实例。这没有任何意义。相应地修正转换器,使id返回getAsString(),完全按照getAsObject()的预期。

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

这应该修复表单提交失败。

另见: