我是JSF的新手,一直在尝试存储使用h:selectOneMenu获取产品类别的表单数据。 h:selectOneMenu从数据库中获取,但是当尝试将产品存储到数据库中时,我收到错误提示:Conversion Error setting value '52' for 'null Converter'。我已经在StackOverflow和在线教程中查看了类似的问题,但我仍然遇到了错误。
这是xhtml代码:
<h:selectOneMenu id="category_fk" value="#{productController.product.category_fk}"
converter="#{categoryConverter}" title="Category_fk" >
<!-- DONE: update below reference to list of available items-->
<f:selectItems value="#{productController.categoryList}" var="prodCat"
itemValue="#{prodCat}" itemLabel="#{prodCat.name}"/>
</h:selectOneMenu>
这是产品控制器:
@Named
@RequestScoped
public class ProductController {
@EJB
private ProductEJB productEjb;
@EJB
private CategoryEJB categoryEjb;
private Product product = new Product();
private List<Product> productList = new ArrayList<Product>();
private Category category;
private List<Category> categoryList = new ArrayList<Category>();
public String doCreateProduct()
{
product = productEjb.createProduct(product);
productList = productEjb.findAllProducts();
return "listProduct";
}
@PostConstruct
public void init()
{
categoryList = categoryEjb.findAllCategory();
productList = productEjb.findAllProducts();
}
// Getters/Setters and other methods omitted for simplicity
这是为简化而简化的EJB:
@Stateless
public class ProductEJB{
@PersistenceContext(unitName = "luavipuPU")
private EntityManager em;
public List<Product> findAllProducts()
{
TypedQuery<Product> query = em.createNamedQuery("findAllProducts", Product.class);
return query.getResultList();
}
public Product createProduct(Product product)
{
em.persist(product);
return product;
}
}
这是简化后的产品实体:
@Entity
@NamedQueries({
@NamedQuery(name="findAllProducts", query = "SELECT p from Product p")
})
public class Product implements Serializable
{
private static final long serialVersionUID = 1L;
@Id @GeneratedValue(strategy= GenerationType.AUTO)
private int product_id;
private String name;
private String description;
protected byte[] imageFile;
private Float price;
@Temporal(TemporalType.TIMESTAMP)
private Date dateAdded;
@ManyToOne
private Category category_fk;
@ManyToOne
private SaleDetails saleDetails_fk;
这是我正在使用的更新转换器:
@ManagedBean
@FacesConverter(value="categoryConverter")
public class CategoryConverter implements Converter{
@PersistenceContext
private transient EntityManager em;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
return em.find(Category.class, new Integer(value));
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Category category;
category = (Category) value;
return String.valueOf(category.getCategory_id());
}
}
代码已经从原始问题中进行了更新,现在代码完美运行。
CategoryConverter
的类实现,因此.java
文件应该被命名为CategoryConverter.java
。您这么做了吗?因为从异常信息看来,你的类名却是CategoryConverterimplements
。此外,我发现您在getAsString
实现中返回了getName()
。这是行不通的。无论您在getAsString
中返回什么,都将作为getAsObject
实现的Value
提供。 - kolossusgetAsString
实现中返回的内容应该是你在getAsObject
中用于搜索对象的内容。为此,我建议使用唯一的id
类型值。 - kolossus@ManagedBean
,错误停止显示。然而,在getAsString
中,我正在尝试返回类似于此的内容:return ((Category)value).getCategory_id().toString();
但我一直收到int cannot be dereferenced
的错误,因此它甚至无法运行。我已更新代码以反映最新更改。提前致谢。 - lv10getCategory_id()
返回什么类型? 如果是int,则建议您在那里使用String.valueOf(getCategory_id())
。 - kolossus