Bonjour à tous,

J'ai un EJB relativement simple, ChienEjb, possédant une méthode add().

Cet EJB est utilisé par l'un de mes Web services comme suit :

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
 
public class ChienWebService {
  ...
 
  @EJB
  private ChienEjb chienEjb
 
  public List<String> addChiens(@XmlElement(required = true) @WebParam(name = "chienContainer") ChienContainer chienContainer) {
 
    try {
      print("A")
      List<String> result = new ArrayList<String>();
 
      for(Chien chien : chienContainer.getchiens()) {
        print("B");
        chienEjb.add(chien);
        result.add(chien.getName() + " is ok");
      }
 
      print("C");
      return result;
 
    } catch(Exception e) {
      e.printStackTrace();
      throw truc;
    }
  }
 
}
Quand j'appelle mon web service avec deux chiens, disons Milou et Idefix dans cet ordre, et qu'Idefix est déjà en base. L'EJB gère bien un rollback sur l'ensemble Milou-Idefix, ce qui est top. Par contre, c'est comme si l'appel à add(..) se faisait de façon asynchrone. en effet, la variable result contient {"Milou", "Idefix"} à la fin du traitement :-( En toute logique, je m'attendais à ce que l'exception lors de l'insert de Idefix fasse sortir de la boucle for... Ca n'entre jamais dans le catch.

Au niveau des traces, ça me donne ABBC. Et quelques millisecondes plus tard, je vois une exception déclenchée par l'EJB...