Domanda

Sono abbastanza nuovo per gli EJB e pieno application server JBoss soffiato come, dopo aver scritto e lavorato con special purpose standalone applicazioni Java per la maggior parte della mia carriera, con uso limitato di Java EE. Mi chiedo circa il modo migliore di adattare un modello di progettazione comunemente usato per EJB3 e JBoss: il modello di fabbrica statica. In realtà questo è Articolo # 1 nel libro Effective Java di Joshua Bloch (2a edizione)

Al momento sto lavorando con il seguente fabbrica:

public class CredentialsProcessorFactory {
    private static final Log log = LogFactory.getLog(CredentialsProcessorFactory.class);
    private static Map<CredentialsType, CredentialsProcessor> PROCESSORS = 
        new HashMap<CredentialsType, CredentialsProcessor>();

    static {
        PROCESSORS.put(CredentialsType.CSV, new CSVCredentialsProcessor());
    }

    private CredentialsProcessorFactory() {}

    public static CredentialsProcessor getProcessor(CredentialsType type) {
       CredentialsProcessor p = PROCESSORS.get(type);
       if(p == null)
           throw new IllegalArgumentException("No CredentialsProcessor registered for type " + type.toString());
       return p;
}

Tuttavia, nelle classi di implementazione di CredentialsProcessor, che richiedono risorse iniettato come un PersistenceContext, così ho fatto l'interfaccia CredentialsProcessor un'interfaccia @Local, e ciascuno dei impl contrassegnato con @Stateless. Ora io posso guardare in alto in JNDI e utilizzare le risorse iniettate.

Ma ora ho una disconnessione perché io non sto usando più la fabbrica. Il mio primo pensiero è stato quello di cambiare il metodo di getProcessor(CredentialsType) da eseguire una ricerca JNDI e restituire l'istanza SLSB che è necessario, ma poi ho bisogno di configurare e passare il nome proprio JNDI qualificato. Prima di andare su questa strada, ho voluto fare ulteriori ricerche su pratiche accettate.

Come è questo modello di progettazione trattata in EJB3 / Java EE -?

È stato utile?

Soluzione

Quando si inizia a giocare con le fabbriche e il codice "reale" Java POJO, è fondamentalmente bisogno di fare affidamento su JNDI.

L'iniezione di dipendenza funziona solo sulle componenti gestiti di un server EJB, e questo è fondamentalmente Servlet e EJB.

Quando si parla di codice Java generico che vuole fare riferimento a EJB, hanno bisogno di ricercare le risorse stesse tramite JNDI.

La cosa migliore da fare, in questo caso, è sufficiente scrivere una classe wrapper di ricerca pieno di funzioni statiche per fare le vostre ricerche JNDI, invece di chiamare direttamente JNDI in ogni implementazione. E quindi utilizzare tale nelle implementazioni.

Questa è solo una regola generale generico.

Ora, per il vostro caso specifico, considerare questo.

Hai:

static {
    PROCESSORS.put(CredentialsType.CSV, new CSVCredentialsProcessor());
}

Questo è non è diverso da:

static {
    PROCESSORS.put(CredentialsType.CSV, "java:comp/env/ejb/CSVCredentialProcessorSessionBean");
}

Poi, nel vostro getProcessor () codice:

Context c = new InitialContext();
return (CredentialsProcessor) c.lookup(PROCESSORS.get(type));

Si veda, in sostanza, il codice è identico, e l'interfaccia di fabbrica è lo stesso per i clienti.

È necessario la chiave di ricerca JNDI "Codice duro", ma si è "difficile codifica" i nomi di classe ora comunque, quindi Qual è la differenza?

Ci sono alcuni potenziali problemi di portabilità tra contenitori, in quanto tutti sembrano desidera utilizzare diversi identificatori JNDI per i nomi di fagioli. La maggior parte di che può essere modificato nella distribuzione, ma se non, allora si può tirare questi tasti in un file di configurazione, o qualsiasi altra cosa.

In Java EE 6, ci sono garantiti i nomi portatili. Se non sei porting contenitori oggi, quindi non preoccuparsi di questo a tutti.

Quindi, in sostanza, non è davvero una disconnessione a tutti.

Altri suggerimenti

Con EJB3, in genere non c'è bisogno di fare ricerche JNDI. EJB3 supporta Dependency Injection di EJB e molti altri tipi di risorse. Se l'attributo di fagioli è annotata con @EJB, la dipendenza viene automaticamente iniettato dal contenitore.

Non dover fare una ricerca JNDI significa che è possibile testare il vostro EJB come un POJO a scopo di test unità. Si può solo iniettare manualmente implementazioni finte delle dipendenze e testarli senza dover distribuire loro in un contenitore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top