Bonjour,
Je me heurte à une exception due, je pense, à la connexion entre jBoss(mon serveur d'application) et Oracle 10g express.
Tout d'abord, voici le context :
J'ai créer mes tables Etudiant, Cours et EtudiantCours avec sqlplus. Ensuite, 2 triggers et 2 séquences pour gérer les clés primaires des tables Etudiants et Cours.
Ensuite sous Eclipse, j'ai crée un projet JPA -> Générer les entity et voici ce que j'ai obtenu :
Entity Etudiant :
Entity Cours
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 package entity; import java.io.Serializable; import java.util.Set; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.ManyToMany; @Entity public class Etudiant implements Serializable { @Id private long nume; private String nome; private String prenome; @ManyToMany(mappedBy="etudiantCollection") private Set<Cours> coursCollection; private static final long serialVersionUID = 1L; public Etudiant() { super(); } public Etudiant(String nom, String prenom) { this.nume = 1; this.nome = nom; this.prenome = prenom; } public long getNume() { return this.nume; } public void setNume(long nume) { this.nume = nume; } public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } public String getPrenome() { return this.prenome; } public void setPrenome(String prenome) { this.prenome = prenome; } public Set<Cours> getCoursCollection() { return this.coursCollection; } public void setCoursCollection(Set<Cours> coursCollection) { this.coursCollection = coursCollection; } }
Voila pour mes entity.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 package entity; import java.io.Serializable; import java.util.Set; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.ManyToMany; @Entity public class Cours implements Serializable { @Id private long idc; private String matiere; @ManyToMany @JoinTable(name="ETUDIANTCOURS", joinColumns=@JoinColumn(name="IDC"), inverseJoinColumns=@JoinColumn(name="NUME")) private Set<Etudiant> etudiantCollection; private static final long serialVersionUID = 1L; public Cours() { super(); } public long getIdc() { return this.idc; } public void setIdc(long idc) { this.idc = idc; } public String getMatiere() { return this.matiere; } public void setMatiere(String matiere) { this.matiere = matiere; } public Set<Etudiant> getEtudiantCollection() { return this.etudiantCollection; } public void setEtudiantCollection(Set<Etudiant> etudiantCollection) { this.etudiantCollection = etudiantCollection; } }
Ensuite, j'ai créé sous Eclipse un projet EJB avec une interface GestionEtudiant et un session bean GestionEtudiantBean
Voici le code :
Interface GestionEtudiant.java
Session bean GestionEtudiantBean.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 package session; import java.util.List; import javax.ejb.Remote; import entity.Etudiant; @Remote public interface GestionEtudiant { public void ajouter(Etudiant etudiant); public Etudiant rechercherEtudiant(String nom); public List<Etudiant> listerTousLesEtudiants(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package session; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import entity.Etudiant; @Stateless public class GestionEtudiantBean implements GestionEtudiant{ @PersistenceContext EntityManager em; public void ajouter(Etudiant etudiant) { em.persist(etudiant); } public Etudiant rechercherEtudiant(String nomE) { return em.find(Etudiant.class, nomE); } public List<Etudiant> listerTousLesEtudiants() { return em.createQuery("SELECT e FROM Etudiant e").getResultList(); } }
Pour faire plus simple, j'ai pris mes 2 entity beans et les ai mis dans mon projet EJB dans un package entity et mon session bean et moninterface dans un package session.
Ensuite, la création d'un client pour tester, simple projet java :
GestionDEtudiant.java
Ensuite, j'ai créé un répertoire META-INF avec le fichier persistence.xml
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 package client; import java.util.Iterator; import java.util.List; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import session.GestionEtudiant; import entity.Etudiant; public class GestionDEtudiant { public static void main(String[] args) { try { Context context = new InitialContext(); GestionEtudiant gEtu = (GestionEtudiant) context.lookup("GestionEtudiantBean/remote"); gEtu.ajouter(new Etudiant("XXX","YYY")); gEtu.ajouter(new Etudiant("XXX","YYY")); gEtu.ajouter(new Etudiant("XXX","YYY")); gEtu.ajouter(new Etudiant("XXX","YYY")); gEtu.ajouter(new Etudiant("XXX","YYY")); /*List<Etudiant> etudiant = gEtu.listerTousLesEtudiants(); for (Iterator iter = etudiant.iterator(); iter.hasNext();) { Etudiant eachEtudiant = (Etudiant) iter.next(); System.out.println(eachEtudiant.getNume()+" : "+eachEtudiant.getNome()+" "+eachEtudiant.getPrenome()); }*/ } catch (Exception e) { e.printStackTrace(); } } }
A la racine du projet, j'ai un fichier jndi.properties
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 sistence> <persistence-unit name="TestEJB"> <jta-data-source>java:/DefaultDS</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="update"/> </properties> </persistence-unit> </persistence>
J'ai testé mon application avec le driver fournit par jBoss hsqldb et ca marche nickel, mes insertions sont bien effectuéesjava.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost:1099
J'ai ensuite configuré jBoss pour qu'il communique avec Oracle
Et la après la premère isertion, une exception est levée, voici la stacktrace :
(Si je vide la table ou je fais les insertions et que je réexécute mon client, la première insertion se refait et une exception est levé à la deuxième exception, si je laisse la table comme elle est, une exception est levé à chaque tentative)
La JRE configué pour jBoss est la jre6, pour les projets c'est par défault, donc la 6 aussijava.lang.reflect.UndeclaredThrowableException
at $Proxy0.ajouter(Unknown Source)
at client.GestionDEtudiant.main(GestionDEtudiant.java:19)
Caused by: java.rmi.MarshalException: Failed to communicate. Problem during marshalling/unmarshalling; nested exception is:
java.io.StreamCorruptedException: invalid type code: FF
at org.jboss.remoting.transport.socket.SocketClientInvoker.transport(SocketClientInvoker.java:306)
at org.jboss.remoting.RemoteClientInvoker.invoke(RemoteClientInvoker.java:143)
at org.jboss.remoting.Client.invoke(Client.java:525)
at org.jboss.remoting.Client.invoke(Client.java:488)
at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:55)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:77)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.stateless.StatelessRemoteProxy.invoke(StatelessRemoteProxy.java:102)
... 2 more
Caused by: java.io.StreamCorruptedException: invalid type code: FF
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at org.jboss.remoting.serialization.impl.java.JavaSerializationManager.receiveObject(JavaSerializationManager.java:128)
at org.jboss.remoting.marshal.serializable.SerializableUnMarshaller.read(SerializableUnMarshaller.java:66)
at org.jboss.remoting.transport.socket.SocketClientInvoker.transport(SocketClientInvoker.java:279)
... 14 more
Donc je n'arrive pas à comprendre cette erreur, pouvez vous m'éclairer, j'ai vu sur le net, qu'il pouvait y avoir des incompatibilités entre les jre
Merci de votre aide
Partager