Hai bisogno di aiuto comprensione JNDI e un particolare ClassCastException in J2EE
-
23-09-2019 - |
Domanda
Ho un'applicazione enterprise A e B schierato (in WLS 10.0). A è il "quadro", B è un applicazione client. Il client invia le seguenti chiamate:
Object o = ctx.lookup(jndiName); // line 1
cf = (ConnectionFactory) o; // line 2
ConnectionFactory è un'interfaccia, definito come:
public interface ConnectionFactory
extends java.io.Serializable, javax.resource.Referenceable {
...
}
Quello che succede è:
- Se il vaso contenente la classe interfaccia è sul classpath di sistema, la linea 2 viene eseguita bene
- Se la classe interfaccia non è sul classpath di sistema, ma confezionato con le applicazioni separatamente, linea 2 getta una ClassCastException (che ha il testo informativo che la o è un ConnectionFactoryImpl)
Perché questo è possibile? Presumo che la ricerca JNDI restituisce solo uno stub per l'oggetto remoto (ho ragione a questo punto?), Allora perché è importante se il programma di caricamento classe della classe di interfaccia sono diversi?
Il tipo di risposta che si aspettano:
- Sì, dovrebbe accadere il modo in cui si verificano, perché ...
- No, non dovrebbe accadere in questo modo, perché se ... allora ..., quindi c'è qualcosa di sospetto nella configurazione
- La situazione che hai descritto è molto strano, sei sicuro di non perdere un certo punto da qualche parte?
- ...:)
Inoltre, sarebbe bello se qualcuno potrebbe chiarire come il JNDI e mozziconi di lavoro, da dove viene il casting accade (sul lato client sul stub? O l'oggetto originale dal lato a distanza?), Ecc.
Grazie per il vostro aiuto!
Soluzione
La risposta, purtroppo, è (1).
JNDI non impone un meccanismo di come l'oggetto viene memorizzato sul legno della croce, o il modo in cui viene consegnato ai clienti. E 'solo un'API da utilizzare per eseguire le operazioni.
Se entrambe le applicazioni sono nella stessa JVM, in quanto sono qui, poi Weblogic è molto probabile che solo consegnando l'oggetto direttamente all'applicazione client. Non v'è alcun stub, e "lato remoto". Dal momento che i tipi attuate da quell'oggetto non sono visibili per l'applicazione client (ricordate, un tipo di identità è definito dal nome della classe, e anche il programma di caricamento classe è stato caricato da).
Si potrebbe pensare che questa è una cosa strana per accadere, ma tenere a mente che le applicazioni a parlare tra di loro in questo modo non è la norma in fase di sviluppo JavaEE - le applicazioni dovrebbero essere isolati gli uni dagli altri, condividere solo le risorse a livello di sistema .