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.
Haben Sie eine 'beans.xml' Datei? Wenn ja, kannst du es teilen? Können Sie außerdem angeben, auf welchen Container Sie bereitstellen? –
@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. –