javax.ejb.EJBException

Dieses Thema javax.ejb.EJBException im Forum "Application Tier" wurde erstellt von Vokabulator, 2. Feb. 2015.

Thema: javax.ejb.EJBException Hallo! Ich erhalte bei meiner JavaEE-Anwendung folgende Esception (Auszug aus dem Stacktrace):...

  1. Hallo!
    Ich erhalte bei meiner JavaEE-Anwendung folgende Esception (Auszug aus dem Stacktrace):

    Code (Text):
    2015-02-02T18:09:02.892+0100|Information: EJB5181:Portable JNDI names for EJB AktionServiceBean: [java:global/Aktionsportal/AktionServiceBean, java:global/Aktionsportal/AktionServiceBean!abc.aktionsportal.services.AktionService]
    2015-02-02T18:09:08.261+0100|Information: Mojarra 2.2.0 ( 20130502-2118 https://svn.java.net/svn/mojarra~svn/tags/2.2.0@11930) f�r Kontext '/Aktionsportal' wird initialisiert.
    2015-02-02T18:09:09.375+0100|Information: Running on PrimeFaces 5.0
    2015-02-02T18:09:09.417+0100|Information: Loading application [Aktionsportal] at [/Aktionsportal]
    2015-02-02T18:09:09.465+0100|Information: Aktionsportal was successfully deployed in 14.465 milliseconds.
    2015-02-02T18:09:27.437+0100|Information: Hibernate: select aktion0_.id as id1_0_, aktion0_.bisherGespendet as bisherGe2_0_, aktion0_.blz as blz3_0_, aktion0_.kontoInhaber as kontoInh4_0_, aktion0_.kontoNr as kontoNr5_0_, aktion0_.nameDerBank as nameDerB6_0_, aktion0_.nameDerAktion as nameDerA7_0_, aktion0_.spendenBetrag as spendenB8_0_, aktion0_.spendenZiel as spendenZ9_0_ from Aktion aktion0_ order by aktion0_.nameDerAktion
    2015-02-02T18:09:51.176+0100|Warnung: EJB5184:A system exception occurred during an invocation on EJB AktionServiceBean, method: public void abc.aktionsportal.services.AktionServiceBean.addAktion(abc.aktionsportal.models.Aktion)
    2015-02-02T18:09:51.177+0100|Warnung: javax.ejb.EJBException
        at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
        at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:698)
        at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:503)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4475)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2009)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1979)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:220)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
        at com.sun.proxy.$Proxy277.addAktion(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:483)
        at org.jboss.weld.util.reflection.Reflections.invokeAndUnwrap(Reflections.java:396)
        at org.jboss.weld.bean.proxy.EnterpriseBeanProxyMethodHandler.invoke(EnterpriseBeanProxyMethodHandler.java:108)


    .....


        ... 35 more
    Caused by: javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of abc.aktionsportal.models.Aktion.id
        at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
        at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)


    ...

    Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of abc.aktionsportal.models.Aktion.id
        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:60)
        at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:346)
        at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:4746)
        at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPers


    ...

     sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
        at java.lang.reflect.Field.get(Field.java:387)
        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:57)
        ... 129 more

    2015-02-02T18:09:51.224+0100|FATAL: JSF1073: javax.faces.FacesException erfasst w�hrend Verarbeitung von INVOKE_APPLICATION 5 : UIComponent-ClientId=, Message=#{aktionAnlegenController.doSave()}: javax.ejb.EJBException
    2015-02-02T18:09:51.224+0100|FATAL: #{aktionAnlegenController.doSave()}: javax.ejb.EJBException
    javax.faces.FacesException: #{aktionAnlegenController.doSave()}: javax.ejb.EJBException
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:89)
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)

    ....

        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
        ... 30 more
    Caused by: javax.faces.el.EvaluationException: javax.ejb.EJBException
        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101)
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
        ... 34 more
    Caused by: javax.ejb.EJBException
        at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
        at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTrans

    ....

        at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
        ... 35 more
    Caused by: javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of abc.aktionsportal.models.Aktion.id
        at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)

        ... 77 more
    Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of abc.aktionsportal.models.Aktion.id
        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:60)

    ....

        ... 118 more
    Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field abc.aktionsportal.models.Aktion.id to abc.aktionsportal.models.Aktion
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
        at

     
    Ich benutze JPA+Hibernate+Glassfish 4

    Meine Entity:

    Code (Text):

    @NamedQueries(@NamedQuery(name ="Aktion.findAll", query = "SELECT a FROM Aktion a ORDER BY a.nameDerAktion"))
    @Entity
    public class Aktion {
        public static final String findAll = "Aktion.findAll";

        private String nameDerAktion;
        private Double spendenZiel;
        private Double spendenBetrag;
        private Double bisherGespendet;

        @Embedded
        private Konto konto;
        @GeneratedValue
        @Id
        private Integer id;
        @OneToMany(mappedBy = "aktion")
        private List<Spende> spenden;

        public Aktion() {
            konto = new Konto();
        }

        ...

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        ...

    }
     
    Die ServiceBean

    Code (Text):
    @Stateless
    public class AktionServiceBean implements AktionService{

        @Inject
        private EntityManager em;
       
    ...

        @Override
        public void addAktion(Aktion aktion) {
            em.persist(aktion);
        }
    Und ich poste gerne noch mehr, falls nötig.

    Kann mit da jemand sagen, was das Problem sein könnte?
     
  2. Vielleicht helfen dir diese Java-Grundlagen weiter --> *Klick*
  3. Hallo

    Wahrscheinlich funktioniert die OneToMany-Beziehung zu Spende nicht korrekt.
    Funktioniert der Zugriff auf die Datenbank, wenn diese Beziehung nicht konfiguriert ist?

    Wenn ja: Versuch doch mal, das OneToMany folgendermassen zu konfigurieren:
    Code (Java):
        @OneToMany()
        @JoinColumn(name = "aktionId")
    (aktionId soll der Name der Spalte in der Tabelle Spalte sein, welche auf Aktion zeigt)


    Freundliche Grüsse
    CptSocket
     
  4. Hallo!

    Also, wenn ich das Ganze weglassen, dann klappt es auch nicht, da kommt schon beim deployen ein Fehler.

    Und dein Vorschlag klappt leider auch nicht, es kommt dieselbe Fehlermeldung....

    Ich hab mal die Spende komplett außen vorgelassen, also nicht mehr als Entity deklariert und die Referenz auf Spende entfernt und er hat immer noch Probleme die id der Aktion zu bekommen.

    Er meckert immer nur wegen dem ID-Feld der Aktion.

    Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of a.models.Aktion.id

    ...

    Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field a.models.Aktion.id to a.models.Aktion



    Die Aktion hat ne ID und entsprechende getter und setter... muss ich die Entity noch irgendwo speziell deklarieren?
     
    Zuletzt bearbeitet: 5. Feb. 2015
  5. Was passiert, wenn du auch das Konto wegnimmst - also nur noch die Aktion ohne irgendwelche referenzen speicherst?

    Bist du sicher, dass der Fehler beim persistieren geworfen wird oder wird auch noch lesend auf die DB zugegriffen?

    Schalte doch mal das sql-logging ein, vielleicht ist da was sichtbar.


    Freundliche Grüsse
    CptSocket
     
  6. Hallo!

    So, hab jetzt wieder Zeit.

    Also:

    Ich hab das Ganze jetzt abgespeckt und habe nur noch die Entity Aktion:

    Code (Text):


    package a.j2ee.models;

    import java.io.Serializable;

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.NamedQueries;
    import javax.persistence.NamedQuery;

    @NamedQueries({
        @NamedQuery(name = Aktion.findAll, query = "SELECT a FROM Aktion a ORDER BY a.nameDerAktion") })
    @Entity
    public class Aktion {

        public static final String findAll = "Aktion.findAll";

        private String nameDerAktion;
        private Double spendenZiel;
        private Double spendenBetrag;
        private Double bisherGespendet;

        @GeneratedValue
        @Id
        private Integer id;
     
        public Aktion() {
        }

        public String getNameDerAktion() {
            return nameDerAktion;
        }

        public void setNameDerAktion(String nameDerAktion) {
            this.nameDerAktion = nameDerAktion;
        }

        public Double getSpendenZiel() {
            return spendenZiel;
        }

        public void setSpendenZiel(Double spendenZiel) {
            this.spendenZiel = spendenZiel;
        }

        public Double getSpendenBetrag() {
            return spendenBetrag;
        }

        public void setSpendenBetrag(Double spendenBetrag) {
            this.spendenBetrag = spendenBetrag;
        }

        public Double getBisherGespendet() {
            return bisherGespendet;
        }

        public void setBisherGespendet(Double bisherGespendet) {
            this.bisherGespendet = bisherGespendet;
        }
       
        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

    }


     
    Die Tabellen werden ordnungsgemäß angelegt und ein Datensatz, den ich in der DB gespeichert habe, wird auch angezeigt.

    Die Exception wird geworfen, wenn ich das Ganze im Browser aufrufe und eine neue Aktion speichern will.

    Beim Speichern passiert Folgendes:

    Im View:

    Code (Text):

                <p:commandButton value="Aktion hinzufügen"
                    action="#{aktionenUebersichtController.doAddAktion()}" ajax="false" />
     
    Im Controller (SessionScoped):

    Code (Text):

        public String doAddAktion() {
            aktionAnlegenController.setAktion(new Aktion()); // Controller wird Injected
            return ViewNamen.AKTION_ANLEGEN_XHTML;
        }
     
    Im anderen Controller, aktionAnlegen, SessionScoped:

    Code (Text):


    public void setAktion(Aktion aktion) {
            this.aktion = aktion;
        }

        public String doSave() {
            aktionAddEventSrc.fire(aktion);
            return ViewNamen.AKTIONEN_UEBERSICHT_XHTML;
        }

     
    Das Event wird hier abgefangen, Klasse ist SessionScoped:

    Code (Text):


        public void onAktionAdded(@Observes @Added Aktion aktion) {
            aktionService.addAktion(aktion); // aktionService wird Injected
        }

     

    Hier die ServiceBean, Stateless:

    Code (Text):


        @Override
        public void addAktion(Aktion aktion) {
            entityManager.persist(aktion);
        }

     

    hier die persistence.xml:

    Code (Text):


    <persistence version="2.1"
        xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/persistence/persistence_2_1.xsd">
        <persistence-unit name="primary" transaction-type="JTA">
            <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
            <jta-data-source>jdbc/mysql</jta-data-source>
            <class>a.j2ee.models.Aktion</class>
            <validation-mode>NONE</validation-mode>
            <properties>
                <property name="hibernate.transaction.jta.platform"
                    value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform" />
                <!-- <property name="hibernate.ejb.cfgfile" value="/hibernate.cfg.xml"/> -->
                <property name="hibernate.hbm2ddl.auto" value="update" />
                <property name="hibernate.archive.autodetection" value="class, hbm" />
                <property name="hibernate.show_sql" value="true" />
                <property name="hibernate.format_sql" value="true" />
                <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />
                <property name="hibernate.connection.password" value="" />
                <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/jee" />
                <property name="hibernate.connection.username" value="root" />
                <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            </properties>
        </persistence-unit>
    </persistence>
     


    Hier die Exception, auszugsweise, mit einem SQL-log

    Code (Text):

    2015-02-08T22:39:07.723+0100|Information: Hibernate:
        select
            aktion0_.id as id1_0_,
            aktion0_.bisherGespendet as bisherGe2_0_,
            aktion0_.nameDerAktion as nameDerA3_0_,
            aktion0_.spendenBetrag as spendenB4_0_,
            aktion0_.spendenZiel as spendenZ5_0_
        from
            Aktion aktion0_
        order by
            aktion0_.nameDerAktion

    // Die Daten aus der Abfrage werden wie gewünscht angezeigt

    // Jetzt klicke ich auf "Speichern", um eine neue Aktion anzulegen:


    2015-02-08T22:39:12.647+0100|Warnung: EJB5184:A system exception occurred during an invocation on EJB AktionServiceBean, method: public void a.services.AktionServiceBean.addAktion(a.models.Aktion)
    2015-02-08T22:39:12.647+0100|Warnung: javax.ejb.EJBException
        at

        at
    a.services.AktionService$1615994833$Proxy$_$$_Weld$EnterpriseProxy$.addAktion(Unknown Source)
        at a.data.ErsatzDB.onAktionAdded(ErsatzDB.java:35)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)


    org.jboss.weld.event.ObserverNotifier.notifyObservers(ObserverNotifier.java:120)
        at org.jboss.weld.event.ObserverNotifier.fireEvent(ObserverNotifier.java:113)
        at org.jboss.weld.event.EventImpl.fire(EventImpl.java:79)
        at a.controller.AktionAnlegenController.doSave(AktionAnlegenController.java:33)
        at a.controller.AktionAnlegenController$Proxy$_$$_WeldClientProxy.doSave(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)



        at java.lang.Thread.run(Thread.java:745)
    Caused by: javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of a.models.Aktion.id
        at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
        at


    Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of a.models.Aktion.id
        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:60)
        at

        ... 129 more

    2015-02-08T22:39:12.657+0100|Warnung: #{aktionAnlegenController.doSave()}: javax.ejb.EJBException
    javax.faces.FacesException: #{aktionAnlegenController.doSave()}: javax.ejb.EJBException
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
        at javax.faces.component.UICommand.broadcast(UICommand.java:315)
        at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
        at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)

        ... 34 more

    Caused by: javax.ejb.EJBException
        at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:748)
        at
    ..-

    Caused by: javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of a.models.Aktion.id
        at


    2015-02-08T22:39:12.734+0100|FATAL: JSF1073: javax.faces.FacesException erfasst w�hrend Verarbeitung von INVOKE_APPLICATION 5 : UIComponent-ClientId=, Message=#{aktionAnlegenController.doSave()}: javax.ejb.EJBException
    2015-02-08T22:39:12.736+0100|FATAL: #{aktionAnlegenController.doSave()}: javax.ejb.EJBException
    javax.faces.FacesException: #{aktionAnlegenController.doSave()}: javax.ejb.EJBException
        at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:89

        at java.lang.Thread.run(Thread.java:745)
    Caused by: javax.faces.FacesException: #{aktionAnlegenController.doSave()}: javax.ejb.EJBException
        at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)

    Caused by: javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of a.models.Aktion.id
        at

    Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of a.models.Aktion.id
        at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:60)

    Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Integer field a.models.Aktion.id to a.models.Aktion
        at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
        at
     
     
    Zuletzt bearbeitet: 12. Feb. 2015
  7. Hallo

    Was mir gerade aufgefallen ist:

    Im persistence.xml steht folgende Zeile:
    Code (Java):
    <class>a.j2ee.models.Aktion</class>
    In der Exception:
    Code (Java):
    Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of a.models.Aktion.id
    => Ist das ein Copy&Paste Fehler oder hast du hier unterschiedliche Packages?


    Freundliche Grüsse
    CptSocket
     
  8. Hallo!

    Das ist ein Fehler. Die liegen im gleichen Package!
     
  9. Was heisst 'das ist ein Fehler'?

    Solange in der Exception/im Stacktrace ein Package angegeben wird, welches nicht mit dem Package von der Klasse übereinstimmt, kann etwas nicht stimmen. Entweder liegt irgendwo noch eine falsche Klasse rum oder es ist sonst etwas nicht korrekt.
    => dem solltest du nachgehen, bevor du weitermachst


    Freundliche Grüsse
    CptSocket
     
  10. Hallo!

    Sorry, das war missverständlich. Es gibt nur eine Klasse Aktion, in einem package. Ich hatte nur zwischenzeitlich die packages umbenannt, mir aber schon den Code in einem word-dokument zurechtkopiert. Da hab ich dann die Aktion aus dem alten package aber die Exception nach der package-umbenennung genommen.

    es gibt nur ein package, daran kann es nicht liegen. beide haben das package a.models und nicht a.j2ee models
     
  11. KOSTENLOSES Java-Grundlagen Training im Wert von 39 € Sichere dir hier den kostenlosen Zugriff auf umfangreiches Java-Know How und starte richtig durch!