2011-10-28 63 views
3

我嘗試使用公開會議中查看模式,但每次我嘗試趕上EntityManagerManagedBeanentityManagerNULL這裏是如何我做:過濾器沒有初始化的EntityManager

package filters; 

// imports..  


public class JPAFilter implements Filter { 

    private EntityManagerFactory factory; 

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

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

     chain.doFilter(request, response); 

     try { 
      entityManager.getTransaction().commit(); 
     } catch (Exception e) { 
      entityManager.getTransaction().rollback(); 
      throw new ServletException(e); 
     } finally { 
      entityManager.close(); 
     } 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     this.factory = Persistence.createEntityManagerFactory("copadomundo"); 

    } 

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

} 

而且這是我的ManagedBean:

package managedbeans; 

// imports .. 

@ManagedBean 
public class PlayerBean { 

    @ManagedProperty(value = "#{entityManager}") 
    private EntityManager entityManager; 

    private Player player = new Player(); 

    private Long teamID; 

    private List<Player> players = new ArrayList<Player>(); 

    public void add() { 
     TeamRepository selecaoRepository = new TeamRepository(this.entityManager); 
     Team selecao = selecaoRepository.search(this.teamID); 
     this.player.setTeam(selecao); 

     PlayerRepository playerRepository = new PlayerRepository(this.entityManager); 
     playerRepository.adiciona(this.player); 

     this.player = new Player(); 
     this.players = null; 
    } 

    public void remove(Player player) { 
     PlayerRepository repository = new PlayerRepository(this.entityManager); 
     repository.remove(player); 
     this.players = null; 
    } 

    // GETTERS AND SETTERS 
    public List<Player> getPlayeres() { 
     if (this.players == null) { 

      PlayerRepository repository = new PlayerRepository(
        this.entityManager); 
      this.players = repository.getPlayeres(); 
     } 
     return this.players; 
    } 

    public EntityManager getEntityManager() { 
     return entityManager; 
    } 

    public void setEntityManager(EntityManager entityManager) { 
     this.entityManager = entityManager; 
    } 

    public Player getPlayer() { 
     return player; 
    } 

    public void setPlayer(Player player) { 
     this.player = player; 
    } 

    public Long getTeamID() { 
     return teamID; 
    } 

    public void setTeamID(Long teamID) { 
     this.teamID = teamID; 
    } 

    public void setPlayeres(List<Player> players) { 
     this.players = players; 
    } 
} 

,這是我的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0"> 
    <display-name>WorldCup</display-name> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <filter> 
     <filter-name>LoginFilter</filter-name> 
     <filter-class>jpa.LoginFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>LoginFilter</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 
    <filter> 
     <filter-name>JPAFilter</filter-name> 
     <filter-class>jpa.JPAFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>JPAFilter</filter-name> 
     <servlet-name>Faces Servlet</servlet-name> 
    </filter-mapping> 
    <error-page> 
     <exception-type>java.lang.Exception</exception-type> 
     <location>/error.xhtml</location> 
    </error-page> 
</web-app> 

任何想法爲什麼會發生這種情況?

UPDATE 約JPA,Hibernate和EJB的每一個地方搜索後,終於讓我找到關於它的一個很好的教程(按照這個順序來了解什麼是一直在做,好嗎?):

Install and Configure MySQL for Eclipse and Oracle Glassfish 3.1

Building a User Registration Form using JSF 2.0

Validation and Conversion of Data Using JSF 2.0

Using EJB 3.0 and JPA 2.0 for Database Persistence

回答

6

這隻有在您的PlayerBean也請求作用域時纔有效。如果它是視圖作用域,那麼任何手動創建的請求作用域屬性都會被忽略,而不是簡單地注入,因爲這個構造是不允許的。您只能注入與接受者相同或更廣範圍的JSF託管屬性。

我知道你的問題的歷史,你正在使用Glassfish 3.你爲什麼不只是使用EJB?這樣容器就會擔心事務本身,你根本不需要這樣的過濾器。您可以通過@PersistenceContext注入EntityManager

這很簡單。只要創建以下EJB類:

@Stateless 
public class PlayerService { 

    @PersistenceContext 
    private EntityManager em; 

    public Player find(Long id) { 
     return em.find(Player.class, id); 
    } 

    public List<Player> list() { 
     return em.createQuery("SELECT p FROM Player p", Player.class).getResultList(); 
    } 

    public void create(Player player) { 
     em.persist(player); 
    } 

    public void update(Player entity) { 
     em.merge(player); 
    } 

    public void delete(Player player) { 
     em.remove(em.contains(player) ? player : em.merge(player)); 
    } 

    // ... 
} 

(沒有必要進一步配置在Glassfish 3)

然後,您可以使用它作爲您的JSF管理的Bean如下:

@ManagedBean 
@ViewScoped 
public class PlayerBean { 

    private List<Player> players; 

    @EJB 
    private PlayerService playerService; 

    @PostConstruct 
    public void init() { 
     players = playerService.list(); 
    } 

    // ... 
} 
+0

的在視圖模式下打開會話用於避免在表示層中使用分離對象,從而避免擔心惰性初始化異常。 –

+0

我明白了@BalusC,感謝隊友,whoooooooooooooooooooooaaaaa! =]終於。 –