最近一个SelectOneMenu的问题忙了差不多一天。
我的web页面如下:
EJB Bean:
实体Bean:
每次打开这个页面的时候SelectOneMenu没有值,其他组件例如InputText能正常显示值。选择一项,然后保存,确实更新了数据库。通过断点查看Converter转换也正确。
实在不知道所以然。后来只好改正这样,虽然有点别扭:
EJB:
这样SelectOneMenu不是绑定到Category而是Category.id,保存的时候要从Category.id查找到Category,然后保存到Sku的Category属性里。破坏了OO,很不优雅。
后来重载了Category的equals方法,问题解决。
我的web页面如下:
<h:selectOneMenu id="cateoty" required="true"
value="#{skuHome.instance.category}">
<f:selectItems value="#{categoryList.categoriesSelectItems}"/>
</h:selectOneMenu>
<ui:define name="label">Sku:</ui:define>
<h:inputText id="name" required="true"
value="#{skuHome.instance.sku}" />
EJB Bean:
public class CategoryList extends EntityQuery
{
private List<Category> categoryList;
private List<SelectItem> categoriesSelectItems;
@Override
public String getEjbql()
{
return "select category from Category category";
}
@Create
public void validate()
{
setCategoriesSelectItems(new ArrayList<SelectItem>());
setCategoryList(super.getResultList());
getCategoriesSelectItems().add(new SelectItem("All Categories","All Categories"));
for (Category c:getCategoryList()){
getCategoriesSelectItems().add(new SelectItem(c,c.getName() ));
}
}
public void setCategoriesSelectItems(List<SelectItem> categoriesSelectItems) {
this.categoriesSelectItems = categoriesSelectItems;
}
public List<SelectItem> getCategoriesSelectItems() {
return categoriesSelectItems;
}
public void setCategoryList(List<Category> categoryList) {
this.categoryList = categoryList;
}
public List<Category> getCategoryList() {
return categoryList;
}
}
Converter:
@org.jboss.seam.annotations.Name("categoryConverter")
@org.jboss.seam.annotations.faces.Converter(forClass = Category.class)
public class CategoryConverter implements javax.faces.convert.Converter {
@In(create = true)
CategoryList categoryList;
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
List<Category> categories = categoryList.getCategoryList();
if (arg2 == null)
return null;
for (Category c : categories)
if (arg2.equals(c.toString()))
return c;
return null;
}
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
if (arg2 != null)
return arg2.toString();
return null;
}
}
实体Bean:
@Entity
public class Category implements Serializable {
private Long id;
private Integer version;
private String name;
@Id @GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Version
public Integer getVersion() {
return version;
}
public void setVersion(Integer version) {
this.version = version;
}
@Length(max=20)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString()
{
return getName();
}
每次打开这个页面的时候SelectOneMenu没有值,其他组件例如InputText能正常显示值。选择一项,然后保存,确实更新了数据库。通过断点查看Converter转换也正确。
实在不知道所以然。后来只好改正这样,虽然有点别扭:
<h:selectOneMenu id="cateoty" required="true"
value="#{skuHome.instance.category.id}">
<f:selectItems value="#{categoryList.categoriesSelectItems}"/>
</h:selectOneMenu>
EJB:
getCategoriesSelectItems().add(new SelectItem(c.getId(),c.getName() ));
这样SelectOneMenu不是绑定到Category而是Category.id,保存的时候要从Category.id查找到Category,然后保存到Sku的Category属性里。破坏了OO,很不优雅。
后来重载了Category的equals方法,问题解决。
public boolean equals(Object o)
{
if (!(o instanceof Category))
return false;
return ((Category)o).getId().equals(this.getId());
}