链接到webservice外部的属性文件

时间:2015-11-11 15:09:51

标签: java web-services rest tomcat jersey

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

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

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

Zack Macomber在这里有一点意见。不要让您的应用/服务动态查找其设置。

让您的构建过程变得动态。

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

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

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

根本没有代码更改。此外,代码将是愚蠢的,因为它不需要知道关于上下文的任何事情。

特别是在处理多人的事情时,这种方法提供了最稳定的长期解决方案。可以为那些需要一些特殊的本地配置和最重要的透明的人自定义,适用于所有不需要或不想了解运行时环境要求的人!

答案 2 :(得分:1)

不确定在这种特殊情况下是否明智,但确实可以在文件系统的任何位置创建.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