【问题标题】:JSF + JPA (PrimeFaces Wizard component)JSF + JPA(PrimeFaces 向导组件)
【发布时间】:2013-03-11 20:28:43
【问题描述】:

我正在学习/培训 JSP,并决定为 PrimeFaces 向导组件添加持久性 (http://www.primefaces.org/showcase/ui/wizard.jsf)。

提交保存方法时出现 NullPointerException:

SEVERE: 'java.lang.NullPointerException' recebido ao invocar escuta de ação '#{userWizard.save}' para o componente 'j_idt56'  
Mar 11, 2013 4:16:12 PM javax.faces.event.MethodExpressionActionListener processAction  
SEVERE: java.lang.NullPointerException  
at org.primefaces.wizard.UserRepository.adiciona(UserRepository.java:16)  
at org.primefaces.wizard.UserWizard.save(UserWizard.java:50)  

Mar 11, 2013 4:16:12 PM com.sun.faces.context.AjaxExceptionHandlerImpl log  
SEVERE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=j_idt4:j_idt56, Message=/wizard.xhtml @128,44 actionListener="#{userWizard.save}": java.lang.NullPointerException  
Mar 11, 2013 4:16:12 PM com.sun.faces.context.AjaxExceptionHandlerImpl log  
SEVERE: /wizard.xhtml @128,44 actionListener="#{userWizard.save}": java.lang.NullPointerException  
javax.faces.event.AbortProcessingException: /wizard.xhtml @128,44 actionListener="#{userWizard.save}": java.lang.NullPointerException  

我认为这是一个简单的问题,但由于这对我来说是新的,而且我一直在寻找这个答案,但没有成功,我请求你的帮助。

这里是 managedBean:

@ManagedBean(name = "userWizard")
@SessionScoped
public class UserWizard {

    private User user = new User();
    private List<User> users;
    private boolean skip;
    private static final Logger logger = Logger.getLogger(UserWizard.class.getName());

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public boolean isSkip() {
        return skip;
    }

    public void setSkip(boolean skip) {
        this.skip = skip;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public void save(ActionEvent actionEvent) {
        // Persist user
        EntityManager manager = this.getEntityManager();
        UserRepository repository = new UserRepository(manager);

        repository.adiciona(this.user);
        this.user = new User();
        // this.users = null;

        FacesMessage msg = new FacesMessage("Successful", "Welcome:" + user.getFirstname());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public List<User> getUsers() {
        if (this.users == null) {
            EntityManager manager = this.getEntityManager();
            UserRepository repository = new UserRepository(manager);
            System.out.println("**** CHAMANDO O REPOSITORIO ****");
            this.users = repository.buscaTodos();
        }
        return this.users;
    }

    public String onFlowProcess(FlowEvent event) {
        logger.log(Level.INFO, "Current wizard step:{0}", event.getOldStep());
        logger.log(Level.INFO, "Next step:{0}", event.getNewStep());

        if (skip) {
            skip = false; // reset in case user goes back
            return "confirm";
        } else {
            return event.getNewStep();
        }
    }

    private EntityManager getEntityManager() {
        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ec.getRequest();
        EntityManager manager = (EntityManager) request.getAttribute("EntityManager");

        return manager;
    }
}

(部分)wizard.xhtml:

持久化类:

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;

public class UserRepository {
    private EntityManager manager;

    public UserRepository(EntityManager manager) {
        this.manager = manager;
    }

    public void adiciona(User user) {
        this.manager.persist(user);
    }

    @SuppressWarnings("unchecked")
    public List<User> buscaTodos() {
        Query query = this.manager.createQuery("select x from USUARIO x");
        return query.getResultList();
    }
}

过滤器类(用于 EntityManager):

@WebFilter(servletNames = { "Faces Servlet" })
public class JPAFilter implements Filter {

            private EntityManagerFactory factory;

            public void init(FilterConfig filterConfig) throws ServletException {
            this.factory = Persistence.createEntityManagerFactory("PrimeWizard-PU");
            }

            public void destroy() {
            this.factory.close();
            }

            public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {

            EntityManager manager = this.factory.createEntityManager();
            request.setAttribute("EntityManager", manager);
            manager.getTransaction().begin();

            chain.doFilter(request, response);

            try {
            manager.getTransaction().commit();
            } catch (Exception e) {
            manager.getTransaction().rollback();
            } finally {
            manager.close();
            }
            }
            }

感谢您的帮助。

【问题讨论】:

  • (部分)wizard.xhtml:
  • 你的 primefaces 版本是什么?

标签: java jakarta-ee jsf-2 primefaces jpa-2.0


【解决方案1】:

NullPointerException 在这一行 this.manager.persist(user); - 这意味着您的 EntityManager 为空。这根本与 JSF 无关。修正您获取EntityManager 的方式,您就可以开始了。

private EntityManager getEntityManager() {
    FacesContext fc = FacesContext.getCurrentInstance();
    ExternalContext ec = fc.getExternalContext();
    HttpServletRequest request = (HttpServletRequest) ec.getRequest();
    EntityManager manager = (EntityManager) request.getAttribute("EntityManager");

    return manager;
}

您的项目中是否有任何东西使EntityManager 在请求映射中可用?这就是我要寻找问题的地方。

【讨论】:

  • 您好。我添加了一个过滤器类,它与 EntityManager 相关。顺便说一句,如果您也可以评论这是使用过滤器来实例化 EntityManager 的好习惯,我将不胜感激。谢谢。
  • @jMarcel 我个人从未见过它以您尝试的方式完成。那里的所有应用程序服务器甚至 servlet 容器通常都有一种方法来管理持久性上下文并为你注入它,所以我怀疑你只需要一个关于如何注入托管持久性上下文的指针。你的环境是什么?雄猫?玻璃鱼?老板?等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 2016-09-27
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多