1

在我的應用程序中,我使用SpringBoot和Spring批處理(和管理)框架。我也使用一個application.yaml文件來存儲我需要的所有屬性。我在Properties中遇到了問題,因爲在SpringBatchAdmin中創建的PropertyPlaceholderConfigurer bean的標記ignoreUnresolvablePlaceholders設置爲false。這裏是上述豆:IllegalArgumentException異常與Spring PropertyPlaceholderConfigurer屬性標誌

<bean id="placeholderProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:/org/springframework/batch/admin/bootstrap/batch.properties</value> 
       <value>classpath:batch-default.properties</value> 
       <value>classpath:batch-${ENVIRONMENT:hsql}.properties</value> 
      </list> 
     </property> 
     <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     <property name="ignoreResourceNotFound" value="true" /> 
     <property name="ignoreUnresolvablePlaceholders" value="false" /> 
     <property name="order" value="1" /> 
    </bean> 

我的問題是,目前春季這3個文件搜索,閱讀全部使用@Value註釋,被取出的屬性。所以會發生的是,我有其他聲明自己屬性的依賴關係,並且Spring迫使我將這些屬性放在SpringBatchAdmin中創建的PropertyPlaceholderConfigurer bean中聲明的3個文件之一中。

因此,舉例來說,下面的類/豆:

@Component 
public class Example{ 
    @Value("${find.me}") 
    private String findMe; 

    ... 
} 

將在以下3個文件,以尋找:

batch.properties 
batch-default.properties 
batch-sqlserver.properties 

,如果財產find.me是不是其中之一文件,然後我得到以下異常:

java.lang.IllegalArgumentException: Could not resolve placeholder 'find.me' in string value "${find.me}" 

我想補充一點問題不是來自使用yaml或Spring未找到「find.me」屬性,因爲如果我不使用創建PropertyPlaceholderConfigurer的SpringBatchAdmin,則在我的application.yaml文件中可以找到屬性「find.me」。

此外,我不能修改PropertyPlaceholderConfigurer問題,因爲它來自外部源(不是我的,但SpringBatchAdmin)。

我該如何解決這個問題?

回答

0

你可以嘗試定義BeanPostProcessor組件設置ignoreUnresolvablePlaceholderstruePropertyPlaceholderConfigurer豆後已創建:

@Component 
class PropertyPlaceholderConfig extends BeanPostProcessor { 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     if (bean instanceof PropertyPlaceholderConfigurer && beanName.equals("placeholderProperties")) { 
      ((PropertyPlaceholderConfigurer) bean).setIgnoreUnresolvablePlaceholders(true); 
     } 

     return bean; 
    } 
} 
相關問題