`
dontsan
  • 浏览: 39906 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

SelectOneMenu 值的绑定问题

阅读更多
最近一个SelectOneMenu的问题忙了差不多一天。

我的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());

	}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics