【问题标题】:Link to properties file outside webservice链接到 Web 服务外部的属性文件
【发布时间】:2015-11-11 15:09:50
【问题描述】:

我有一个使用 Java、REST、Jersey 并在 Tomcat8 上运行的网络服务。 Web 服务需要访问数据库。根据我们在流程中所处的位置,我们可能正在使用测试数据库、生产数据库或其他东西。理想情况下,我们希望能够设置使用哪个数据库,而无需更改代码和重新编译。

我们尝试过的方法是使用属性文件定义数据库参数并使用环境变量指向该文件。事实证明这很麻烦,首先我们很难在 Tomcat 服务器上定义我们可以从应用程序中读取的系统属性,而且似乎所有文件都必须在类路径中定义,即已经提前配置和代码库的一部分。

这似乎是相当普遍的情况,所以我确定有推荐的方法来处理这种情况?

【问题讨论】:

  • 根据您的帖子,听起来您有 1 个 Web 服务正在与测试、产品或其他数据库进行交互。为什么不在适当的环境(开发、测试、产品)中提供 Web 服务?让 1 个 Web 服务访问多个环境 IMO 真的很危险……可能会错误地更新产品……开发 Web 服务应该访问开发数据库、测试 Web 服务测试数据库等……
  • 我会将属性存储在应用程序中,并根据环境有一些Maven profiles。根据配置文件,您在应用程序中打包适当的属性文件。要阅读属性文件,您可以查看Apache DeltaSpike Configuration Mechanism。看看这个answer
  • 如果上面提到的方法不能满足您的需求,请将属性文件外部化并使用 JNDI 来引用该文件。看看这个answer

标签: java web-services rest tomcat jersey


【解决方案1】:

扎克·麦康伯在这点上说得很有道理。不要让您的应用/服务动态查找其设置。

改为让您的构建过程动态化。

Maven、Gradle 和朋友都提供了根据构建参数和/或任务/配置文件修改输出的简单方法。

在您的代码中始终链接到同一个文件(名称)。然后将根据您的任务和/或构建环境包含实际文件。用于测试的测试配置。用于生产的生产配置。

在许多情况下,不需要完全重新编译,因此会被跳过(这当然取决于您的工具)。

根本没有代码更改。此外,代码将非常愚蠢,因为它不需要了解任何有关上下文的信息。

特别是在与多人一起工作时,这种方法提供了最稳定的长期解决方案。可以为那些需要一些特殊的本地配置和最重要的透明的人定制,适合所有不需要或不想了解运行时环境要求的人!

【讨论】:

    【解决方案2】:

    我们有一个类似的案例。我们在同一个端点 (/admin) 上创建了第二个 Web 服务,我们调用它来设置一些配置参数。我们还有一个数据库,用于在设置后持久化配置。为了让生活更轻松,我们还创建了一个简单的 UI 来设置这些值。用户在 UI 中配置值,UI 调用 /admin Web 服务,/admin 服务在内存(作为属性)以及 DB 中设置配置。主 Web 服务使用属性作为动态配置。

    注意:我们使用基于 JWT 的授权来防止对 /admin 的未经授权的访问。但是根据您的需要,您可以保持它不安全,使用基本的 HTTP 身份验证或使用更详细的东西。

    【讨论】:

      【解决方案3】:

      不确定在这种特殊情况下是否明智,但确实可以在文件系统的任何位置创建.properties 文件 - 并通过Resources 元素将其链接到您的应用程序。

      https://tomcat.apache.org/tomcat-8.0-doc/config/resources.html

      Resources 元素代表 Web 应用程序可用的所有资源。这包括类、JAR 文件、HTML、JSP 和任何其他有助于 Web 应用程序的文件。提供实现以使用目录、JAR 文件和 WAR 作为这些资源的来源,并且可以扩展资源实现以支持以其他形式存储的文件,例如在数据库或版本化存储库中。

      您需要一个PreResources 元素,链接到一个文件夹,其内容将通过/WEB-INF/classes 提供给应用程序。

      <Context antiResourceLocking="false" privileged="true" docBase="${catalina.home}/webapps/myapp">
      
          <Resources className="org.apache.catalina.webresources.StandardRoot">
      
              <!-- external res folder (contains settings.properties) -->
              <PreResources className="org.apache.catalina.webresources.DirResourceSet"       
               base="/home/whatever/path/config/"
               webAppMount="/WEB-INF/classes" /> 
      
          </Resources>    
      
      </Context>
      

      您的应用程序现在“看到”/home/whatever/path/config/ 中的文件,就好像它们位于 /WEB-INF/classes 一样。

      通常,Resources 元素放在Context 元素中。 Context 元素必须放在位于以下位置的文件中:

      $CATALINA_BASE/conf/[enginename]/[hostname]/ROOT.xml
      

      https://tomcat.apache.org/tomcat-8.0-doc/config/context.html#Defining_a_context

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-20
        • 2018-04-30
        • 1970-01-01
        • 2021-12-14
        • 2021-08-19
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多