2010-04-05 6 views
1

J'utilise JBoss4.2.2 et java6.

Le nom de l'oreille est déployée apa.ear

Dans un servlet je la ligne de code suivant:

placeBid = (PlaceBid) context.lookup("apa/" 
    + PlaceBid.class.getSimpleName() + "/remote"); 

J'ai un jboss-app.xml généré comme ceci:

<jboss-app> 
    <loader-repository>apa:app=ejb3</loader-repository> 
</jboss-app> 

Lorsque j'essaie d'obtenir le PlaceBid via le contexte, j'obtiens cette exception

java.lang.ClassCastException: $Proxy99 cannot be cast to se.nextit.actionbazaar.buslogic.PlaceBid 

L'interface PlaceBid ressemble à ceci:

@Remote 
public interface PlaceBid { 
Long addBid(String userId, Long itemId, Double bidPrice); 
} 

Quand je lance l'exemple à venir avec EJB3 en action cela fonctionne. EJB3 dans l'exemple de code d'action est livré avec la construction de fourmis. Je veux utiliser Maven donc j'ai réarrangé le code.

Cependant, je ne comprends pas ce que je fais mal ici. J'ai quelques réflexions sur le fichier jboss-app.xml. Je ne suis pas sûr de la façon dont son contenu devrait ressembler.

Reconnaissant pour toute aide.

Meilleurs voeux Lasse

+0

donne le code où vous injectez 'PlaceBid' – Bozho

Répondre

1

En premier lieu, procédez comme suit:

Object obj = context.lookup("apa/" + PlaceBid.class.getSimpleName() + "/remote"); 
System.out.println("Object = " + obj.getClass().getName()); 
System.out.println("Interfaces = " + Arrays.toString(obj.getClass().getInterfaces())); 

Il vous dira ce que le talon réelle de classe concrète est et quelles interfaces qu'il implémente. Cela peut alors vous donner assez d'indices pour comprendre ce qui ne va pas.

probablement aussi votre haricot est défini comme:

@Stateless 
public class MyPlaceBidBean implements PlaceBid { 
    ... 
} 

à-dire qu'elle implémente l'interface PlaceBid?

0

Si le contexte est de type javax.naming.Context (ou InitialContext), le problème est que vous avez un appel manquant à PortableRemoteObject.narrow:

placeBid = (PlaceBid) PortableRemoteObject.narrow(context.lookup("apa/" 
    + PlaceBid.class.getSimpleName() + "/remote", PlaceBid.class); 

Ceci est requis par la spécification EJB pour distance interfaces. Si vous utilisez une référence à la place (@EJB ou ejb-ref), le conteneur gérera l'étroit pour vous.

Questions connexes