我需要从我的系统中获取 pdf 文档。我为此使用 Apache Fop - 该库使用 2 个文件来生成 pdf - 带结构和样式的 xsl 文件以及带数据的 xml 文件。因此,我从 Web 资源获取 xsl 文件,但现在我需要使用数据库中的数据生成 xml。我尝试了这个解决方案: 我有这个界面:
public interface PrintableDocument {
Object getJaxBOjbect(Long personId);
}
这是获取对象的无状态 bean 之一,我还需要 10 个这样的 bean 来获取不同文档的不同数据。
@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
}
}
所以现在我想创建像这样的工厂:
@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);
}
}
在服务 bean 上我想使用这个工厂:
@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.
}
}
但是现在我从工厂的 getPrintableDocument 中得到 null 。我认为问题是我需要无状态 bean,并且当 getPrintableDocument 方法结束时,它们会被拾回 EJB 容器。所以我的问题是:我该如何处理这种情况?
编辑 1: 缺少 Factory 中 init 上的 PostConstruct 注释。已修复,问题仍然存在。
编辑2:如果我的工厂上有@Singleton
,它会只保存无状态PrintableDocument
bean的一一实例还是它会返回池化实例吗?因为现在我必须在工厂上重新填充策略持有者 map ,而系统将需要另一个人来回答请求。
最佳答案
您可以尝试使用@EJB
而不是@Inject
将PrintableDocumentsFactory
注入(inject)到您的DocumentServiceBean
中。
关于java - 使用 EJB 的无状态工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40297687/