簡體   English   中英

tomcat 未讀取環境變量

[英]tomcat not reading environment variables

我有一個在 AKS 上運行的 tomcat 應用程序。 我創建了一堆環境變量,所以當 tomcat 啟動時,它可以替換值。 當我在容器中使用printenv時,它會顯示通過 deployment.yaml 設置的所有環境變量。

但是,當 tomcat 啟動時,它仍然無法識別環境變量,並顯示如下內容:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'PACSDemoController': Invocation of init method failed; nested exception is java.net.URISyntaxException: Illegal character in path at index 1: ${widgetsRestBaseUrl}

這是我的 class:

public class BaseDemoController {  
    protected URI restUri;

    @Resource(name = "widgetsRestBaseUrl")
    protected String widgetsRestBaseUrl;

    @Resource(name = "widgetsServerUploaderUrl")
    protected String widgetsServerUploaderUrl;

    @Resource(name = "widgetsServerViewerUrl")
    protected String widgetsServerViewerUrl;

    @Resource(name = "widgetsServerStudySelectionUrl")
    protected String widgetsServerStudySelectionUrl;
    
    @Resource(name = "widgetsServerHieStudySelectionUrl")
    protected String widgetsServerHieStudySelectionUrl;

    @Resource(name = "widgetsServerPatientHistoryUrl")
    protected String widgetsServerPatientHistoryUrl;
    
    @Resource(name = "widgetsServerShareImageUrl")
    protected String widgetsServerShareImageUrl;

    @Resource(name = "widgetServerPacsConfigUrl")
    protected String widgetServerPacsConfigUrl;
    @Resource(name = "apiNominate")
    protected String apiNominate;

    @Resource(name = "apiPacsConfig")
    protected String apiPacsConfig;
    @Resource(name = "widgetsServerNominatePacsUrl")
    protected String widgetsServerNominatePacsUrl;
    

    @Resource(name = "apiBaseUrl")
    protected String apiBaseUrl;    

    @Resource(name = "widgetsBasicPacsConfigUrl")
    protected String widgetsBasicPacsConfigUrl;
    
    @Resource(name = "auth0Domain")
    protected String auth0Domain;    
    
    @Resource(name = "widgetAuth0Audience")
    protected String widgetAuth0Audience;    
    
    @Resource(name = "apiAuth0Audience")
    protected String apiAuth0Audience;    
   
    @Autowired
    protected EpicTokenService epicTokenService;

    @PostConstruct
    public void initialize() throws URISyntaxException {
        restUri = new URI(widgetsRestBaseUrl);
    }

所有這些資源都來自jndi.xml

?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">

    <bean id="apiBaseUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${apiBaseUrl}"/>
    </bean>

    <bean id="widgetsRestBaseUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsRestBaseUrl}"/>
    </bean>

    <bean id="widgetsServerUploaderUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsServerUploaderUrl}"/>
    </bean>

    <bean id="widgetsServerViewerUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsServerViewerUrl}"/>
    </bean>

    <bean id="widgetsServerStudySelectionUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsServerStudySelectionUrl}"/>
    </bean>

    <bean id="widgetsServerPatientHistoryUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsServerPatientHistoryUrl}"/>
    </bean>

    <bean id="widgetsServerShareImageUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsServerShareImageUrl}"/>
    </bean>

    <bean id="widgetServerPacsConfigUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetServerPacsConfigUrl}"/>
    </bean>

    <bean id="apiPacsConfig" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${apiPacsConfig}"/>
    </bean>

    <bean id="apiNominate" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${apiNominate}"/>
    </bean>

    <bean id="widgetsServerNominatePacsUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsServerNominatePacsUrl}"/>
    </bean>

    <bean id="widgetsBasicPacsConfigUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsBasicPacsConfigUrl}"/>
    </bean>

    <bean id="widgetsServerHieStudySelectionUrl" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetsServerHieStudySelectionUrl}"/>
    </bean>

    <bean id="apiAuth0Audience" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${apiAuth0Audience}"/>
    </bean>

    <bean id="widgetAuth0Audience" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${widgetAuth0Audience}"/>
    </bean>

    <bean id="auth0Domain" class="java.lang.String" factory-method="valueOf">
        <constructor-arg value="${auth0Domain}"/>
    </bean>

</beans>

我不確定為什么這不起作用。 我有兩個項目幾乎完全相同,一個項目沒有問題。 有什么建議嗎?

更新:PACDemoController 從 BaseDemoController 擴展:

@Controller
public class PACSDemoController extends BaseDemoController {

並且錯誤來自 BaseDemoController 中的 @PostConstruct。 這是日志:

Caused by: java.net.URISyntaxException: Illegal character in path at index 1: ${widgetsRestBaseUrl}
    at java.net.URI$Parser.fail(URI.java:2848)
    at java.net.URI$Parser.checkChars(URI.java:3021)
    at java.net.URI$Parser.parseHierarchical(URI.java:3105)
    at java.net.URI$Parser.parse(URI.java:3063)
    at java.net.URI.<init>(URI.java:588)
    at com.accelarad.smr.widgets.demo.BaseDemoController.initialize(BaseDemoController.java:90)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:363)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:307)
    at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization(InitDestroyAnnotationBeanPostProcessor.java:136)
    ... 27 more

Tomcat 與將${...}替換為相應系統環境變量的值沒有任何關系。 它僅替換其自己的配置文件中的這些值( server.xml ,各種context.xml描述符等)。

如果您希望 Spring 替換那些屬性占位符${...} ,您需要將PropertySourcesPlaceholderConfigurer添加到您的應用程序上下文中。 這可以通過以下方式完成:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:property-placeholder />
    ...
</beans>

但是,使用@Value注釋直接從 Spring Environment注入屬性值要容易得多,而不是創建數百個java.lang.String類型的 bean。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM