2013-03-11 4 views
0

JSP를 학습/교육 중이며 PrimeFaces 마법사 구성 요소 (http://www.primefaces.org/showcase/ui/wizard.jsf)에 지속성을 추가하기로 결정했습니다.JSF + JPA (PrimeFaces 마법사 구성 요소)

내가 저장 방법 제출 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(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 :

지속성 클래스 (EntityManager를위한)

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(); 
    } 
} 

필터 클래스 :

여기

는 ManagedBean은 인
@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(); 
      } 
      } 
      } 

도와 줘서 고마워.

+0

(부분) wizard.xhtml :

jMarcel

+0

primefaces 버전은 무엇입니까? – berkay

답변

2

이 라인의 NullPointerExceptionthis.manager.persist(user); - EntityManager이 null임을 의미합니다. 이것은 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 사용할 수를 만드는 프로젝트에 있나요? 그것이 내가 문제를 찾고있는 곳입니다.

+0

안녕하세요. EntityManager와 관련된 필터 클래스를 추가했습니다. 그건 그렇고, 이것이 필터를 사용하여 EntityManager를 인스턴스화하는 좋은 사례인지 논평 해 주시면 감사하겠습니다. 고맙습니다. – jMarcel

+0

@jMarcel 개인적으로 당신이 그것을하려는 방식대로 진행되는 것을 본 적이 없습니다. 밖에있는 모든 응용 프로그램 서버와 서블릿 컨테이너에는 일반적으로 지속성 컨텍스트를 관리하고이를 삽입하는 방법이 있으므로 관리되는 지속성 컨텍스트를 주입하는 방법에 대한 포인터가 필요합니다. 당신의 환경은 무엇입니까? 수코양이? GlassFish? JBoss? 기타 – rdcrng