转换错误设定值“52”的“空转换器” [重复](Conversion Error setting v

2019-07-03 12:08发布

这个问题已经在这里有一个答案:

  • 对于“空转换器”转换错误设定值-为什么我需要在JSF一个转换器? 2个回答

我是新来的JSF和我一直在试图将数据从使用啊形式存储:selectOneMenu用于获得一个产品类别。 在H:selectOneMenu用于正在从数据库填充,但是,尝试存储在一个数据库中的产品时,我得到一个错误:为“空转换器”转换错误设定值“52”。 我在网上审查的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());

    }

}

该代码已经从一部开拓创新的问题更新,代码完美的作品了。

Answer 1:

不能使用在自定义类型<h:selectOneMenu/>组分(或任何一种<h:selectXXXX/>而不创建JSF) 转换器 。 转换器,JSF可以协助与基本翻译自定义或切断端项目/构建成网页友好/人类可读的格式,还能够从客户端保存选择回服务器端。 那么什么错误消息基本上是告诉你有,它可以没有任何意义足够的价值52从客户端提交给它保存到服务器端作为一个Category的对象/类型

所以,你需要做的是建立一个JSF的实现converter ,基本上可以帮助您的JSF是有意义的Category对象。

下面是你需要做一个粗略的估计:

  1. 实现你的一个转换器Category类型:

     // You must annotate the converter as a managed bean, if you want to inject // anything into it, like your persistence unit for example. @ManagedBean(name = "categoryConverterBean") @FacesConverter(value = "categoryConverter") public class CategoryConverter implements Converter { @PersistenceContext(unitName = "luavipuPU") // I include this because you will need to // lookup your entities based on submitted values private transient EntityManager em; @Override public Object getAsObject(FacesContext ctx, UIComponent component, String value) { // This will return the actual object representation // of your Category using the value (in your case 52) // returned from the client side return em.find(Category.class, new BigInteger(value)); } @Override public String getAsString(FacesContext fc, UIComponent uic, Object o) { //This will return view-friendly output for the dropdown menu return ((Category) o).getId().toString(); } } 
  2. 参考新的转换器在你<h:selectOneMenu/>

     <h:selectOneMenu id="category_fk" converter="#{categoryConverterBean}" value="#productController.product.category_fk}" title="Category_fk" > <!-- DONE: update below reference to list of available items--> <f:selectItems value="#{productController.categoryList}" var="prodCat" itemValue="#{prodCat.category_id}" itemLabel="#{prodCat.name}"/> </h:selectOneMenu> 

我们使用的名称categoryConverterBean因为我们要带你拉转换器的实体管理技巧的优势。 其他情况下,你会一直使用您的转换器注释设置的名称。



Answer 2:

Product.category_fk似乎型范畴的,我怀疑prodCat.category_id是整数或东西...

在您的XHTML你似乎设置selectItems的的值设置为: itemValue="#{prodCat.category_id}"

当selectOneMenu用于期望的值value="#{productController.product.category_fk}"

这是最有可能不是同一类型的。



文章来源: Conversion Error setting value '52' for 'null Converter' [duplicate]