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

时间:2016-07-25 06:44:07

标签: java-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-root>
   </web>
</module>

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

1 个答案:

答案 0 :(得分:2)

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

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

使用数据库

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

这种方法有效,但在数据库中使用配置数据有点丑陋,因为它非常特定于应用程序。数据库往往不仅仅用于一个应用程序。除非你已经开始使用这样的表,否则我不推荐这条路径。

使用属性文件

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

String pathToConf = System.getProperty("jboss.server.config.dir");

这使您能够将配置文件放在那里并在应用程序中读取它们,例如在@Singleton EJB中。

你会在这里找到一个更加详细的答案:

wildfly: reading properties from configuration directory

我非常喜欢这个选项。文件系统上的文件也是零安全保护,操作系统可以为您完成工作。

使用Java属性

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

-Dmyapp.upload.dir=/path/to/dir

然后在您的代码中使用与上面相同的代码行返回此属性。

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

这是开发方面最少的努力。我自己并不是很喜欢这个选项,因为它涉及更改服务器配置,这可能会在你的控制范围之外丢失,比如在修补过程中。