【问题标题】:java.lang.NullPointerException selectOneMenu convertorjava.lang.NullPointerException selectOneMenu 转换器
【发布时间】:2013-06-03 15:25:13
【问题描述】:

我有一个类专业化

public class Specialization implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Column(name = "id")
    private Integer id;
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 45)
    @Column(name = "name")
    private String name;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "specialization")
    private Collection<Doctor> doctorCollection;

在我的网页中,我有一个 selectOneMenu

            <h:selectOneMenu value="#{specializationMB.specialization}"
                             converter="#{specializationConverter}">
                <f:selectItems value="#{specializationMB.allSpecializations}" var="specialization"
                               itemLabel="#{specialization.name}" itemValue="#{specialization}" />
            </h:selectOneMenu>

GenericDao 的 find 方法在哪里

public abstract class GenericDao<T> {

    @PersistenceContext
    private EntityManager em;
    private Class<T> entityClass;

    public GenericDao(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    public void create(T entity) {
        em.persist(entity);
    }

    public void delete(T entity) {
        T toRemoved = em.merge(entity);
        em.remove(toRemoved);
    }

    public T update(T entity) {
        return em.merge(entity);
    }

    public T find(int entityID) {
        return em.find(entityClass, entityID);
    }

    @SuppressWarnings({"unchecked", "rawtypes"})
    public List<T> findAll() {
        CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
        cq.select(cq.from(entityClass));
        return em.createQuery(cq).getResultList();
    }
}

我为我的专业类创建转换器

public class SpecializationConverter implements Converter{

    private static SpecializationDao sdao = new SpecializationDao();

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        return sdao.find(new Integer(value));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        return ((Specialization) value).getId().toString();
    }

}

但是当我转到下一页时,我的 selectOneMenu 出现错误。

java.lang.NullPointerException
    at pl.ePrzychodnia.dao.GenericDao.find(GenericDao.java:40)
    at pl.ePrzychodnia.converter.SpecializationConverter.getAsObject(SpecializationConverter.java:24)
    at com.sun.faces.renderkit.html_basic.HtmlBasicInputRenderer.getConvertedValue(HtmlBasicInputRenderer.java:171)
    at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectOneValue(MenuRenderer.java:202)
    at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:319)
    at javax.faces.component.UIInput.getConvertedValue(UIInput.java:1030)
    at javax.faces.component.UIInput.validate(UIInput.java:960)
    at javax.faces.component.UIInput.executeValidate(UIInput.java:1233)
    at javax.faces.component.UIInput.processValidators(UIInput.java:698)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIForm.processValidators(UIForm.java:253)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIComponentBase.processValidators(UIComponentBase.java:1214)
    at javax.faces.component.UIViewRoot.processValidators(UIViewRoot.java:1172)
    at com.sun.faces.lifecycle.ProcessValidationsPhase.execute(ProcessValidationsPhase.java:76)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    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)

我现在不知道为什么。有人可以帮忙吗?

【问题讨论】:

  • pl.ePrzychodnia.dao.GenericDao.find(GenericDao.java:40)发帖。
  • 使用Integer.parseInt()而不是分配new Integer,你不一定要创建一个新实例。
  • 我在帖子中添加了查找方法。 Integer.parseInt() 没有帮助。
  • 请确保您的 EntityManager 已正确注入
  • 我知道在这种情况下它不会有帮助,但最好这样使用它。

标签: jsf


【解决方案1】:

private static SpecializationDao sdao = new SpecializationDao();

假设这个 DAO 是你的 GenericDAO 的子类,你能告诉我 EntityManager 是什么时候注入的吗?让容器创建你的 DAO!你的EntityManager 没有被注入,因此你得到了NPE

我将创建一个无状态会话 bean(如果您使用 EJB),然后将其注入转换器。

@Stateless
public class SpecializationService extends GenericCRUDService {...}

public class SpecializationConverter implements Converter{

    @Inject
    private SpecializationService specializationService;
...

我也认为 DAO 的术语和模式有点过时了。阅读它,例如 here

【讨论】:

  • 通过在 2013 年 5 月引用 2009 年 1 月的一篇文章来声称某些东西已经过时了,好吧,至少很有趣 :)
  • @skuntsel:我很高兴随时让你微笑。 :) 但是你不认为如果它在 2009 年被一些过时的人考虑过,那么在几年之后更是如此吗?
  • @BalázsMáriaNémeth,亚当在那里得出了一些牵强的结论。 “一个对象有状态和行为,而 DAO 没有”。 DAO 如何没有状态或行为?它没有什么可变的吗?我想这是一个观点问题。
  • @kolossus:我找不到你引用的那句话。他说“DAO 是无状态的,只包含数据操作操作。”。但话虽如此,我认为最好的讨论地点是在他的博客上,而不是在这里 :)
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 2012-12-06
  • 2013-04-10
  • 1970-01-01
  • 2022-06-13
  • 2015-04-28
  • 2012-08-25
  • 2011-01-30
相关资源
最近更新 更多