javax.ejb.EJBException

Vokabulator

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

Code:
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:
@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:
@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?
 

CptSocket

Aktives Mitglied
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:
Java:
    @OneToMany()
    @JoinColumn(name = "aktionId")
(aktionId soll der Name der Spalte in der Tabelle Spalte sein, welche auf Aktion zeigt)


Freundliche Grüsse
CptSocket
 

Vokabulator

Mitglied
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:

CptSocket

Aktives Mitglied
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
 

Vokabulator

Mitglied
Hallo!

So, hab jetzt wieder Zeit.

Also:

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

Code:
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:
			<p:commandButton value="Aktion hinzufügen"
				action="#{aktionenUebersichtController.doAddAktion()}" ajax="false" />

Im Controller (SessionScoped):

Code:
	public String doAddAktion() {
		aktionAnlegenController.setAktion(new Aktion()); // Controller wird Injected
		return ViewNamen.AKTION_ANLEGEN_XHTML;
	}

Im anderen Controller, aktionAnlegen, SessionScoped:

Code:
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:
	public void onAktionAdded(@Observes @Added Aktion aktion) {
		aktionService.addAktion(aktion); // aktionService wird Injected
	}


Hier die ServiceBean, Stateless:

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


hier die persistence.xml:

Code:
<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:
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:

CptSocket

Aktives Mitglied
Hallo

Was mir gerade aufgefallen ist:

Im persistence.xml steht folgende Zeile:
Java:
<class>a.j2ee.models.Aktion</class>
In der Exception:
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
 

CptSocket

Aktives Mitglied
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
 

Vokabulator

Mitglied
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
 

Ähnliche Java Themen

Neue Themen


Oben