java - 使用 EJB 的无状态工厂

标签 java jakarta-ee design-patterns cdi ejb-3.1

我需要从我的系统中获取 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而不是@InjectPrintableDocumentsFactory注入(inject)到您的DocumentServiceBean中。

关于java - 使用 EJB 的无状态工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40297687/

相关文章:

java - 如何查看@ComponentScan扫描的类路径列表以解决NoSuchBeanDefinitionException

java - 如何在 IE 选项卡而不是新窗口中打开 URL - Java

java - JPA 2 (EclipseLink) 尝试使用 UUID 作为主键 EntityManager.find() 总是抛出异常(数据库是 PostgreSQL)

java - 具有 Multi-Tenancy 架构的 Spring Security

java - 使用许多 if-else 语句(多个条件)优化函数的最佳方法是什么?

java - 仅当 Optional 存在时才解包

mysql - 删除父级时 Hibernate/MySQL 级联错误

c# - 用具体类型覆盖抽象方法

database - 在定义表中使用外键还是在代码中使用常量?

java - 在java中拆分多个字符串