2016-08-07 67 views
1

Ich begann vor kurzem Glassfish und BoneCP auf Intellij Idee mit einer einfachen Web-App zu verwenden, aber es gibt einen Bug, den ich nicht verstehen kann. Ich glaube, ich habe alle Schritte des Tutorials befolgt.javax.ejb.CreateException: Konnte nicht stateless EJB mit Glassfish und BoneCP auf Intellij-Idee

Mein Modell geht so

@Entity 
public class Song implements Serializable { 

@Id 
private String id; 
private String title; 
private LocalDate lastPlayed; 
private int playCount; 

public Song() { 
    title = "Chant sans titre"; 
    id = generateId(title); 
    lastPlayed = LocalDate.ofEpochDay(0); 
    playCount = 0; 
} 

EJB

@Stateless 
public class SongDAO { 

@PersistenceUnit(unitName = "statisthira_song") 
private EntityManager em; 

public void create(Song song){ 
    try { 
     em.persist(song); } catch (Exception e) { e.printStackTrace(); } 
} 

die Servlets

@WebServlet(urlPatterns = "/new-song") 
public class NewSongActionBean extends HttpServlet { 

@EJB 
SongDAO dao; 

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    Song song = new Song(); 
     song.setTitle("This is not a Test - Toby Mac"); 
     song.setId(song.generateId(song.getTitle())); 
    dao.create(song); 

    this.getServletContext().getRequestDispatcher("/WEB-INF/newsong.jsp").forward(request, response); 
} 
} 

Meine persistence.xml Datei unter META-INF

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
     http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 

<persistence-unit name="statisthira_song" transaction-type="JTA"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <jta-data-source>jdbc/bonecp_resource</jta-data-source> 
    <class>statis.hira.model.Song</class> 
</persistence-unit> 

</persistence> 

der Server läuft ohne Probleme, und wenn ich den jdbc-Verbindungspool mit einem Ping überprüfen, ist es erfolgreich. Aber wenn ich versuche, die URL für den Zugriff auf "/ new-song", bekomme ich diese Fehlermeldung

HTTP Status 500 - Internal Server Error 

type Exception report 

message Internal Server Error 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB 

hier eine Probe des stacktrace

javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB 
at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:435) 
at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2579) 
at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1971) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:210) 
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 
at com.sun.proxy.$Proxy194.create(Unknown Source) 
at statis.hira.dao.__EJB31_Generated__SongDAO__Intf____Bean__.create(Unknown Source) 
at statis.hira.servlets.NewSongActionBean.doGet(NewSongActionBean.java:26) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734) 
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673) 
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174) 
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283) 
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459) 
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167) 
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235) 
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132) 
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111) 
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536) 
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591) 
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB 
at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:700) 
at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:246) 
at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:430) 
... 37 more 
Caused by: javax.ejb.CreateException: Could not create stateless EJB 
at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:514) 
at com.sun.ejb.containers.StatelessSessionContainer.access$000(StatelessSessionContainer.java:97) 
at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:698) 
... 39 more 
Caused by: java.lang.IllegalStateException: Exception attempting to inject Env-Prop: statis.hira.dao.SongDAO/[email protected] Resource. Class name = statis.hira.dao.SongDAO Field [email protected]@@@ into class statis.hira.dao.SongDAO: Can not set javax.persistence.EntityManager field statis.hira.dao.SongDAO.em to com.sun.enterprise.container.common.impl.EntityManagerFactoryWrapper 
at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:175) 
at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:46) 
at org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:73) 
at org.jboss.weld.injection.producer.StatelessSessionBeanInjector.inject(StatelessSessionBeanInjector.java:60) 
at org.jboss.weld.injection.producer.ejb.SessionBeanInjectionTarget.inject(SessionBeanInjectionTarget.java:140) 
at org.glassfish.weld.services.JCDIServiceImpl.injectEJBInstance(JCDIServiceImpl.java:257) 
at com.sun.ejb.containers.BaseContainer.injectEjbInstance(BaseContainer.java:1748) 
at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:475) 
... 41 more 
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Env-Prop: statis.hira.dao.SongDAO/[email protected] Resource. Class name = statis.hira.dao.SongDAO Field [email protected]@@@ into class statis.hira.dao.SongDAO: Can not set javax.persistence.EntityManager field statis.hira.dao.SongDAO.em to com.sun.enterprise.container.common.impl.EntityManagerFactoryWrapper 
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:740) 
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:507) 
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:170) 
at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:165) 
... 48 more 
Caused by: java.lang.IllegalArgumentException: Can not set javax.persistence.EntityManager field statis.hira.dao.SongDAO.em to com.sun.enterprise.container.common.impl.EntityManagerFactoryWrapper 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167) 
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171) 
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:81) 
at java.lang.reflect.Field.set(Field.java:764) 
at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:688) 
... 51 more 

Antwort

1

Sie sollten von

ändern
@PersistenceUnit(unitName = "statisthira_song") 

zu

@PersistenceContext(name= "statisthira_song") 

@PersistenceUnit verwendet EntityManagerFactory zu injizieren und @PersistenceContext verwendet wird EntityManager

+0

Antworten auf das Leben der großen Fragen manchmal so einfach sein kann zu injizieren. Vielen Dank –