0

我对 p:selectonemenu 有疑问。服务器日志和我的代码如下。问题:我尝试编写一个具有 CRUD 功能的简单应用程序。h:selectonemenu 按预期工作。但是当我切换到 p:selectonemenu 时,我得到了转换器异常。通常我的选项数据包括数据库中的 3 行。我在初始化后打印了选项作为调试目的,我的列表是用正常的元素初始化的。

然而,使用 p:selectmenu,我的列表再次用那里的元素初始化(由 init 函数中的 syso 证明。),但是一个额外的 selectonemenu 选项,null 一个到达转换器。它会引发异常。

我调试了应用程序并在那里看到了额外的空对象。我的转换器用 h:selectonemenu 调用了 3 次,用 p:selectmenu 调用了至少 4 次。

我可能犯了一个错误。但这是我的错误还是其他什么?

玻璃鱼 3.1.2,PM 3.3.1

服务器日志(h:selectmenu):

INFO: Hibernate: 
    select
        grup0_.grup_id as grup1_8_,
        grup0_.grup_adi as grup2_8_ 
    from
        Grup grup0_
INFO: Selectonemenu Option@Init :Test Value 1
INFO: Selectonemenu Option@Init :Test Value 2
INFO: Selectonemenu Option@Init :Test Value 3
INFO: Selectonemenu Option@Converter :Test Value 1
INFO: Selectonemenu Option@Converter :Test Value 2
INFO: Selectonemenu Option@Converter :Test Value 3

服务器日志(p:selectmenu):

INFO: Hibernate: 
    select
        grup0_.grup_id as grup1_8_,
        grup0_.grup_adi as grup2_8_ 
    from
        Grup grup0_
INFO: Selectonemenu Option@Init :Test Value 1
INFO: Selectonemenu Option@Init :Test Value 2
INFO: Selectonemenu Option@Init :Test Value 3
INFO: Selectonemenu Option@Converter :Test Value 1
INFO: Selectonemenu Option@Converter :Test Value 2
INFO: Selectonemenu Option@Converter :Test Value 3

INFO: Hibernate: 
    select
        grup0_.grup_id as grup1_8_,
        grup0_.grup_adi as grup2_8_ 
    from
        Grup grup0_
INFO: Selectonemenu Option@Init :Test Value 1
INFO: Selectonemenu Option@Init :Test Value 2
INFO: Selectonemenu Option@Init :Test Value 3
INFO: Selectonemenu Option@Converter :Test Value 1
INFO: Selectonemenu Option@Converter :Test Value 2
INFO: Selectonemenu Option@Converter :Test Value 3
**INFO: Selectonemenu Option@Converter :null**
SEVERE: Error Rendering View[/NewFile.xhtml]
javax.faces.convert.ConverterException: getAsString Error
    at converters.GrupConverter.getAsString(GrupConverter.java:60)
    at org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:76)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeLabel(SelectOneMenuRenderer.java:120)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:89)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:62)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:722)

WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
javax.faces.convert.ConverterException: getAsString Error
    at converters.GrupConverter.getAsString(GrupConverter.java:60)
    at org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:76)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeLabel(SelectOneMenuRenderer.java:120)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:89)
    at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:62)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
    at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
    at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
    at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    at java.lang.Thread.run(Thread.java:722)

测试.xhtml

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
            xmlns:p="http://primefaces.org/ui"

      xmlns:ui="http://java.sun.com/jsf/facelets"> 

<h:head></h:head> 
<body> 
<h:form>
<p:selectOneMenu id="grup" value="#{grupBean.grup}" converter="grupConverter">
                            <f:selectItems value="#{grupBean.grupList}" var="grp" itemLabel="#{grp.grup_adi}" itemValue="#{grp}" />
                        </p:selectOneMenu>
</h:form>

</body> 
</html>

Grup.java

package model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Grup implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 8730335332086520080L;
    @Id
    @GeneratedValue
    private Integer grup_id;
    private String grup_adi;

    @ManyToMany(mappedBy="gruplar")
    private List<Kullanici> kullanicilar = new ArrayList<Kullanici>();

    public Integer getGrup_id() {
        return grup_id;
    }

    public void setGrup_id(Integer grup_id) {
        this.grup_id = grup_id;
    }

    public String getGrup_adi() {
        return grup_adi;
    }

    public void setGrup_adi(String grup_adi) {
        this.grup_adi = grup_adi;
    }

    public List<Kullanici> getKullanicilar() {
        return kullanicilar;
    }

    public void setKullanicilar(List<Kullanici> kullanicilar) {
        this.kullanicilar = kullanicilar;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((grup_id == null) ? 0 : grup_id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (!(obj instanceof Grup))
            return false;
        Grup other = (Grup) obj;
        if (grup_id == null) {
            if (other.grup_id != null)
                return false;
        } else if (!grup_id.equals(other.grup_id))
            return false;
        return true;
    }

}

GrupConverter.java

package converters;

import model.Grup;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;
import javax.persistence.EntityManager;

import util.EntityUtil;

@FacesConverter(value = "grupConverter")
public class GrupConverter implements Converter {

    EntityManager em = EntityUtil.getEntityManager();

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String deger) {

        Grup findGrup = null;
        if (deger == null || deger.isEmpty()) {
            return null;
        }

        try {
            findGrup = em.find(Grup.class, Integer.parseInt(deger));
            // System.out.println(findGrup.);
        } catch (Exception e) {
            throw new ConverterException(new FacesMessage(String.format(
                    "Cannot convert %s to Grup", deger)), e);
        }
        return findGrup;

    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object deger) {
        String val = null;

        // ....................

        Grup d = (Grup) deger;
        System.out
                .println("Selectonemenu Option@Converter :" + d.getGrup_adi());

        // .....................

        try {
            Grup b = (Grup) deger;
            val = Integer.toString(b.getGrup_id());

        } catch (Exception e) {
            throw new ConverterException(new FacesMessage("getAsString Error"));

        }

        return val;

    }

}

GrupBean.java

package beans;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.persistence.EntityManager;

import model.Birim;
import model.Grup;

import util.EntityUtil;



@ManagedBean
@ViewScoped
public class GrupBean implements Serializable{

private static final long serialVersionUID = 2166603645975073743L;
List<Grup> grupList=null;
List<Birim> birimList;

EntityManager em = EntityUtil.getEntityManager();


private boolean edit;

Grup grup=new Grup();



@PostConstruct 
public void init()
    {
    grupList = em.createQuery("from Grup").getResultList();
    //birimList=em.createQuery("from Birim").getResultList();

     for (Grup grup : grupList) {
     System.out.println("Selectonemenu Option@Init :"+grup.getGrup_adi());

         }

    }



public void add()
    {
    System.out.println("Add");

    em.getTransaction().begin();
    em.persist(grup);
    em.getTransaction().commit();

    System.out.println("End of Add");
    grupList = em.createQuery("from Grup").getResultList();
    edit = false;
    grup = new Grup(); // Reset placeholder.    

    }



public void edit(Grup grup) {
    this.grup = grup;
    //System.out.println("Grup Edit"+grup.anAdi());
    edit = true;
   }

public void save() {
    // dao.update(item);

    System.out.println("save");
    em.getTransaction().begin();
    em.merge(grup);
    em.getTransaction().commit();
    System.out.println("End of save");
    edit = false;
    grupList = em.createQuery("from Grup").getResultList();
    grup = new Grup(); // Reset placeholder.    
}

public void delete(Grup grup) {

    System.out.println("delete");

    em.getTransaction().begin();
    em.remove(grup);
    em.getTransaction().commit();

    System.out.println("End of delete");
    grup = new Grup(); // Reset placeholder.
    edit = false;
    grupList = em.createQuery("from Grup").getResultList();

}



public List<Grup> getGrupList() {
    return grupList;
}



public void setGrupList(List<Grup> grupList) {
    this.grupList = grupList;
}



public Grup getGrup() {
    return grup;
}



public void setGrup(Grup grup) {
    this.grup = grup;
}

public boolean isEdit() {
    return edit;
}



public List<Birim> getBirimList() {
    return birimList;
}



public void setBirimList(List<Birim> birimList) {
    this.birimList = birimList;
}



}
4

0 回答 0