2 Stateless Beans 1 Local Interface?

  • Themenstarter Themenstarter Achim Lindt
  • Beginndatum Beginndatum
A

Achim Lindt

Gast
Hallo zusammen,

ich habe zwei Services die eine identische datenimport Funktionalität über zwei verschiedene Strategien lösen (Stichwort Strategy Pattern).

Lokales EJB Interface
Java:
@Local
public interface IImportStrategy{

public void importData(File file);

}

1. Bean
Java:
@Stateless
public class LocalImport implements IImportStrategy{
    
    @Override
    public void importData(File file){...}

}

2. Bean
Java:
@Stateless
public class DistributedImport implements IImportStrategy{

    @Override
    public void importData(File file){...}

}

Ich möchte nun gerne über den Deployment-Deskriptor oder so dem Application Server mitteilen, welche Bean er jetzt nehmen soll (d.h. das mapping Interface -> Implementierung) - geht das? Zur Laufzeit wird das ja kaum möglich sein...

Oder besteht die Möglichkeit, dass beide ein eigenes @Local Interface implentieren und diese Interfaces dann von dem bestehenden IImportStrategy interface erben?

Hintergrund: Es soll ohne Codierungsaufwand möglich sein die Strategie zu ändern.

Bin für Vorschläge dankbar!

Beste Grüße,
Achim
 
Nachdem der AS kein Bean hernimmt sondern der Client muss der halt entscheiden, welches Bean er über den JNDI Lookup denn benutzen möchte.
 
D.h. der AppServer (bei mir Glassfish) wird nicht meckern wenn 2 Beans das gleiche Interface benutzen?

Folgendes wäre dann z.B. ok?
Java:
{
   ...
   InitialContext ctx = new InitialContext;
   IImportStrategy import;
   boolean useLocal = false;
   try{
      if (useLocal){
          import = ctx.lookup(java:comp/ejb/LocalImport ) 
      }
      else{
          import = ctx.lookup(java:comp/ejb/DistributedImport)
      }
}
catch(...){...}
 
D.h. der AppServer (bei mir Glassfish) wird nicht meckern wenn 2 Beans das gleiche Interface benutzen?

Folgendes wäre dann z.B. ok?
Java:
{
   ...
   InitialContext ctx = new InitialContext;
   IImportStrategy import;
   boolean useLocal = false;
   try{
      if (useLocal){
          import = ctx.lookup(java:comp/ejb/LocalImport ) 
      }
      else{
          import = ctx.lookup(java:comp/ejb/DistributedImport)
      }
}
catch(...){...}

Jein. Der Applicationserver hätte kein Problem mit den Interfaces.

Aber die Spec verbietet dir java.io.File in einem Bean zu verwenden.

Zitat aus der Spec:
An enterprise bean must not use the java.io package to attempt to access files and directo-ries in the file system.
 
Okay, danke für den Hinweis - werde das entsprechend umbauen. Wichtig war das mit den Interfaces.
 

Neue Themen


Zurück
Oben