覆盖在Tomcat中作为WAR部署的Spring-boot应用程序的属性时的奇怪行为

时间:2018-07-13 13:51:51

标签: spring-boot tomcat

我有一个spring-boot应用程序,需要将它作为WAR部署在雄猫中。 我还需要定义/覆盖一些属性,以便该应用程序可以在此环境中工作。

我能够通过创建与我的WAR文件同名的文件tomcat/conf/Catalina/localhost/backend.xml来做到这一点。这里的内容:

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true" crossContext="true" override="true" path="/back" docBase="/home/myAppUser/webapps/backend.war">
    <Environment name="spring.profiles.active" value="prod" type="java.lang.String" />
    <Environment name="application.attachmentBaseDirectory" value="/home/myAppUser/attachments" type="java.lang.String" />
    <Environment name="application.redirect-url" value="http://myapp.mycompany.org/frontend" type="java.lang.String" />
</Context>

application.attachmentBaseDirectory以外的所有环境变量均有效。 该应用程序继续使用在Windows上为我的开发环境定义的应用程序:C:\tmp\attachments

但是,如果我创建文件/home/myAppUser/application.yml/home/myAppUser/config/application.yml,则该值将被正确覆盖...

application:
  attachmentBaseDirectory: /home/myAppUser/attachments

但是,如果我在文件中代替backend.xml定义所有值,那么除application.attachmentBaseDirectory之外的其他值都无法工作…

这是我的问题:

  1. 为什么tomcat/conf/Catalina/localhost/backend.xml中的替代方法不适用于此值,而对其他值有用?
  2. 在雄猫内部运行时,WAR如何能够找到application.yml
  3. 为什么application.attachmentBaseDirectory属性可以在application.yml文件中起作用,而其他属性不能起作用?

更多信息:

这是我的ApplicationProperties.java上的内容。

@Component
@ConfigurationProperties("application")
public class ApplicationProperties {

    /**
     * The URL to which we should redirect the user once he is logged in the application.
     */
    private String redirectUrl;

    /**
     * The base directory in which we should put the attachments.
     */
    private String attachmentBaseDirectory;

}

然后,该Bean在@Controller中用于redirectUrl重定向到另一个网页,并在@Service中用于attachmentBaseDirectory保存文件。

1 个答案:

答案 0 :(得分:0)

我终于找到了为什么在application.attachmentBaseDirectory中设置属性tomcat/conf/Catalina/localhost/backend.xml无效的原因:

这是因为它被命名为application.attachmentBaseDirectorycamel case)而不是application.attachment-base-directorykebab case)。

Spring-boot allow relaxed binding,但是似乎要通过tomcat上下文使用,kebab case方法才是可行的方法。


尚未解决:

  • 在tomcat中运行时,WAR为何能在application.yml目录中找到home
    • 我怀疑这是因为我从主目录启动了tomcat。
  • 为什么application.attachmentBaseDirectoryapplication.yml开始工作,而其他属性却没有?