A injeção do JPA Entity Manager Factory falha (JPA 2, Eclipselink, J2EE 6)

Eu estou tentando obter um aplicativo de web pequeno exemplo instalado e em execução, mas eu tive um problema ao injetar o Entity Manager Factory.

Meu persistence.xml é o seguinte;

  org.eclipse.persistence.jpa.PersistenceProvider jdbc/Maindb      

O aplicativo da web tem duas funções; retornar um cliente e uma lista de itens.

O object CustomerResource injeta a fábrica do gerenciador de entidades da seguinte maneira:

 @PersistenceUnit(unitName="main") private EntityManagerFactory emf; 

e consulta a camada de persistência pelo seguinte código;

 EntityManager em = emf.createEntityManager(); Customer customer = (Customer) em.find(Customer.class, customerID); 

Isso funciona sem problemas (que estou ciente), recebo os dados esperados retornados.

O object ItemResource faz a mesma coisa contra a mesma unidade de persistência.

 @PersistenceUnit(unitName="main") private EntityManagerFactory emf; 

Mas a injeção falha e o emf é sempre nulo.

 EntityManager em = emf.createEntityManager(); <- emf is null here 

Não tenho certeza do que fiz de errado aqui, meu palpite é que estou usando a fábrica do gerenciador de entidades incorretamente.

Qualquer ajuda seria muito apreciada! obrigado

Atualizar

Eu estava pegando o código problemático para colocar um arquivo de guerra para todos olharem, o que me ajudou a isolar o problema.

O problema parece estar nos padrões de URL que estou usando.

web.xml

   com.sun.xml.ws.transport.http.servlet.WSServletContextListener   Item com.sun.xml.ws.transport.http.servlet.WSServlet 1   Item /Item/*   Customer com.sun.xml.ws.transport.http.servlet.WSServlet 1   Customer /Customer   

sun-jaxws.xml:

      

O recurso de item agora possui dois methods da Web;

  1. Obter detalhes do item
    Digite: Get
    Caminho: /
    Parâmetro Web: id de item

  2. Obter lista de itens
    Digite: Get
    Caminho: / list
    Web param: Item Color

Com os curingas nos padrões de URL, o gerenciador de entidades é sempre nulo. Se eu remover os curingas, posso solicitar um item com êxito, não posso solicitar uma lista de itens porque ele não está mapeado.

As solicitações de resources do cliente sempre são bem-sucedidas porque não contêm curingas nos mapeamentos.

obrigado

Não tenho certeza se isso responderá a pergunta (por que o EMF é null no segundo caso?), Mas como você está usando um gerenciador de entidades gerenciado por aplicativo, você fecha o EntityManager corretamente? Algo assim:

 public class LoginServlet extends HttpServlet { @PersistenceUnit(unitName="EmployeeService") EntityManagerFactory emf; protected void doPost(HttpServletRequest request, HttpServletResponse response) { String userId = request.getParameter("user"); // check valid user EntityManager em = emf.createEntityManager(); try { User user = em.find(User.class, userId); if (user == null) { // return error page // ... } } finally { em.close(); } } 

Mas, sinceramente, eu realmente me pergunto por que você não está usando um gerenciador de entidades gerenciado por contêiner. É muito mais simples deixar o contêiner gerenciar seu ciclo de vida na minha opinião. Para obter um EntityManager injetado:

 @PersistenceContext(unitName = "main") private EntityManager em;