2016-10-28 6 views
1

Ich habe eine Anforderung, pdf-Dokumente von meinem System zu erhalten. Ich benutze dafür Apache Fop - und diese Bibliothek verwendet 2 Dateien, um eine pdf - xsl Datei mit Struktur und Styling und XML mit Daten zu erzeugen. Also ich bekomme Xsl-Datei von Web-Ressourcen, aber jetzt muss ich XML mit Daten aus der Datenbank generieren. Ich habe versucht, diese Lösung: Ich habe diese Schnittstelle:Staatenlose Fabrik mit EJB

public interface PrintableDocument { 
    Object getJaxBOjbect(Long personId); 
} 

, dass eine der stateless Bean-Objekt zu erhalten, brauche ich 10 mehr Bohnen wie diese verschiedene Daten für verschiedene Dokumente zu erhalten.

@Stateless 
@PrintableDocumentOneQualifier 
public class PrintableDocumentOne implements PrintableDocument { 

    @Inject 
    private SomeRepository repository; 

    public Object getJaxBOjbect(Long personId) { 
    // Getting information from database 
    // formulating Object with data and returning it 
    } 
} 

So, jetzt will ich Fabrik schaffen wie diese:

@Stateless 
@LocalBean 
public class PrintableDocumentsFactory { 

    @Inject 
    @PrintableDocumentOneQualifier 
    private PrintableDocument printableDocumentOne; 

    @Inject 
    @PrintableDocumentTwoQualifier 
    private PrintableDocument printableDocumentTwo; 

    private Map<String, PrintableDocument> map = new HashMap<>(); 

    @PostConstruct 
    public void init() { 
     map.put("one", printableDocumentOne); 
     map.put("two", printableDocumentTwo); 
    } 

    public PrintableDocument getPrintableDocument(String type) { 
     return map.get(type); 
    } 

} 

Und auf der Service-Bean möchte ich diese Fabrik verwenden:

@Stateless 
@Local(DocumentService.class) 
public class DocumentServiceBean { 

    @Inject 
    private PrintableDocumentsFactory factory; 

    public byte[] getPdf(InputStream xsl, Long id, String type) { 
     PrintableDocument printableDocument = 
      factory.getPrintableDocument(type); 
     Object jaxBOject = printableDocument.getJaxBObject(id); 
     //Use this object to get pdf and return it to web controller. 
    } 

} 

Aber jetzt bin ich immer null von getPrintableDocument von der Fabrik. Ich denke, das Problem ist, dass ich Stateless-Beans brauche, und sie werden wieder in den EJB-Container aufgenommen, wenn die getPrintableDocument-Methode endet. Meine Frage ist also: Wie kann ich diese Art von Situation bewältigen?

EDIT 1: Verpasste PostConstruct Annotation auf Init in Factory. Behoben, dass das Problem immer noch besteht.

EDIT 2: Wenn ich @Singleton auf meiner Fabrik haben wird es nur eins nach dem anderen Instanzen von stateless PrintableDocument Bohnen halten oder es wird gepoolt Instanzen zurückgeben statt? Denn jetzt muss ich die Strategie-Halterkarte auf Fabrik nachfüllen, wenn das System eine andere benötigt, um die Anfrage zu beantworten.

+0

Haben Sie eine 'beans.xml' Datei? Wenn ja, kannst du es teilen? Können Sie außerdem angeben, auf welchen Container Sie bereitstellen? –

+0

@JohnAment beans.xml ist leer, da ich keine Interzeptoren, Alternativen und so weiter habe. Container - Wildfliege 10.1.0.Final. Eigentlich funktioniert diese Lösung jetzt sogar mit '@ Inject' Annotation. Ich frage mich, ob ein anderes Problem damit zusammenhängt. –

Antwort

1

Sie könnten versuchen, @EJB anstelle von @Inject zu verwenden, um die PrintableDocumentsFactory in Ihre DocumentServiceBean zu injizieren.

+0

Ich möchte speziell '@ Inject' verwenden, weil ich Unit Tests mit CDI Alternativen mit Arquillian habe. Danke im Voraus, werde es trotzdem versuchen. –

0

Versuchen Sie, eine Annotation zu PrintableDocumentsFactory.init() Methode hinzuzufügen. Zur Zeit wird die init Methode nicht aufgerufen, also wird kein get in der Karte registriert.

+0

Eigentlich habe ich diese Annotation beim Listing verpasst. Ich habe es auf Projekt. Entschuldigung, mein fehler. Wird die Frage bearbeiten. –