Jakarta ee 获取EJB中WEB模块的上下文根

Jakarta ee 获取EJB中WEB模块的上下文根,jakarta-ee,web,jboss,ejb,ear,Jakarta Ee,Web,Jboss,Ejb,Ear,我有一个带有WEB模块和EJB模块的EAR项目。 这来自application.xml: <module> <ejb>PersonEJB.jar</ejb> </module> <module> <web> <web-uri>PersonWeb.war</web-uri> <context-root>PersonWeb</context-roo

我有一个带有WEB模块和EJB模块的EAR项目。 这来自application.xml:

<module>
    <ejb>PersonEJB.jar</ejb>
</module>
<module>
    <web>
      <web-uri>PersonWeb.war</web-uri>
      <context-root>PersonWeb</context-root>
   </web>
</module>

PersonEJB.jar
战争
人网

我想把一个文件从EJB写到WEB项目中,我需要找到这个WEB项目的路径。首先,我需要从EJB中的application.xml读取上下文根,但我不知道如何做到这一点。如果这不是我需要的解决方案,请告诉我另一个解决方案。

基本上,您希望有一种方法来指定EJB的路径,而无需以任何方式对其进行硬编码-路径将根据应用程序的部署位置而改变

这意味着使其可配置,并且有几个选项可以实现这一点。这里有一把


使用数据库

如果您已经有一个数据库,那么可以向其中添加一个表,该表包含一个简单的键值对,并以这种方式指定特定于服务器的配置数据。在您的应用程序中,您只需在应用程序启动时加载此数据一次,比如在
@Singleton
EJB中

这种方法是可行的,但在数据库中包含配置数据有点麻烦,因为它是非常特定于应用程序的。数据库往往用于不止一个应用程序。我不推荐这种方法,除非您已经有了这样一个表


使用属性文件

另一种方法是将其存储在属性文件中。大多数应用服务器都有一个特定的位置,您可以在其中放置特定于实例的配置文件,并能够将它们加载到应用程序中。因为这是在JBoss环境中进行的,所以可以将文件放在服务器实例的conf目录中。您可以通过编程方式获取conf目录的路径,如下所示:

String pathToConf = System.getProperty("jboss.server.config.dir");
这使您能够将配置文件放在那里,并将它们读回应用程序中,例如在
@Singleton
EJB中

您可以在这里找到更详细的答案,答案非常简单:

我非常喜欢这个选择。文件在文件系统上的安全性也是零努力的,操作系统会为您完成这项工作


使用Java属性

如果它只是一个配置属性,那么如果您知道要修改哪个文件或设置哪个环境变量来实现这一点(如果不知道,将记录它),则可以将它作为命令行属性传递给服务器实例。您可以添加一个参数

-Dmyapp.upload.dir=/path/to/dir
然后在代码中使用与上面相同的代码行获取此属性

    String pathToConf = System.getProperty("myapp.upload.dir");

这是开发方面最少的努力。我自己也不太喜欢这个选项,因为它涉及到更改服务器配置,这可能会在您无法控制的情况下丢失,比如在一轮修补过程中。

基本上,您希望有一种方法可以指定到EJB的路径,而无需以任何方式对其进行硬编码-路径将根据应用程序的部署位置而改变

这意味着使其可配置,并且有几个选项可以实现这一点。这里有一把


使用数据库

如果您已经有一个数据库,那么可以向其中添加一个表,该表包含一个简单的键值对,并以这种方式指定特定于服务器的配置数据。在您的应用程序中,您只需在应用程序启动时加载此数据一次,比如在
@Singleton
EJB中

这种方法是可行的,但在数据库中包含配置数据有点麻烦,因为它是非常特定于应用程序的。数据库往往用于不止一个应用程序。我不推荐这种方法,除非您已经有了这样一个表


使用属性文件

另一种方法是将其存储在属性文件中。大多数应用服务器都有一个特定的位置,您可以在其中放置特定于实例的配置文件,并能够将它们加载到应用程序中。因为这是在JBoss环境中进行的,所以可以将文件放在服务器实例的conf目录中。您可以通过编程方式获取conf目录的路径,如下所示:

String pathToConf = System.getProperty("jboss.server.config.dir");
这使您能够将配置文件放在那里,并将它们读回应用程序中,例如在
@Singleton
EJB中

您可以在这里找到更详细的答案,答案非常简单:

我非常喜欢这个选择。文件在文件系统上的安全性也是零努力的,操作系统会为您完成这项工作


使用Java属性

如果它只是一个配置属性,那么如果您知道要修改哪个文件或设置哪个环境变量来实现这一点(如果不知道,将记录它),则可以将它作为命令行属性传递给服务器实例。您可以添加一个参数

-Dmyapp.upload.dir=/path/to/dir
然后在代码中使用与上面相同的代码行获取此属性

    String pathToConf = System.getProperty("myapp.upload.dir");

这是开发方面最少的努力。我本人不太喜欢这个选项,因为它涉及到更改服务器配置,这可能会在您无法控制的情况下丢失,比如在修补过程中。

一般来说,您可以从web层调用EJB,因此您可以在web层获取数据,并将其作为参数传递给EJB方法。您将这两个模块建模为独立的模块,因此我认为您不希望EJB模块直接意识到存在web模块。我使用EJB作为REST服务,因此以前无法获取数据。你说的对。但是我应该在哪里写上传的文件呢?一般来说,您可以从web层调用EJB,这样您就可以在web层中获取数据,并将其作为参数传递给EJB方法。您将这两个模块建模为独立的模块,因此我认为您不希望EJB模块直接意识到存在web模块。我使用EJB作为REST服务,因此以前无法获取数据。你说的对。但是