我正面临使用转换器正确填充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]
”,依此类推。图片样本如下:
有人可以帮忙吗?提前谢谢。
答案 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();
这应该修复表单提交失败。