/ / @Value w moim sterowniku wiosennym nie działa - sprężyna, obiekt zastępczy właściwości

@Wartość w moim kontrolerze wiosny nie działa - wiosna, obiekt zastępczy

Mój kontroler ma

@Value("${myProp}")
private String myProp;

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}

@RequestMapping(value = "myProp", method = RequestMethod.GET)
public @ResponseBody String getMyProp(){
return "The prop is:" + myProp;
}

mój applicationcontext.xml ma

<bean id="appConfigProperties" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
<property name="location" value="classpath:MyApps-local.properties" />
</bean>

Otrzymuję następujący wyjątek:

Przyczyna: java.lang.IllegalArgumentException: Nie można rozwiązać symbol zastępczy „myProp” w wartości ciągu „$ {myProp}”

Uwaga: Mój plik właściwości MyApps-local.properties jest w classpath i zawiera myProp=delightful

każda pomoc byłaby świetna ....

Odpowiedzi:

2 dla odpowiedzi № 1

W konfiguracji opartej na XML musisz użyć PropertyPlaceholderConfigurer fasola

<beans xmlns="http://www.springframework.org/schema/beans" . . . >
. . .
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:database.properties" />
</bean>
. . .
</beans>

ale możesz użyć wartości z database.properties tylko w konfiguracji xml

<beans xmlns="http://www.springframework.org/schema/beans" . . >
. . .
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
. . .
</beans>

Jeśli chcesz użyć wartości z plików właściwości w środku @Value adnotację do pól fasoli, musisz dodać @Confuguration i @PropertySource adnotacja do klasy fasoli. Lubię to

@Configuration
@PropertySource("classpath:database.properties")
public class AppConfig {

@Value("${jdbc.url}")
private String url;

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
}

1 dla odpowiedzi nr 2

W twojej konfiguracji masz dwaPropertySourcesPlaceholderConfigurer. Pierwszy zdefiniowany w DispatcherServlet przy użyciu Java @Configuration używa standardowego środowiska do wyszukiwania właściwości. Oznacza to właściwości środowiska systemowego i zmiennych środowiskowych, a także zdefiniowane @PropertySource.

To nie jest świadome twojego lokalnego MyApps.plik właściwości określony w pliku applicationContext.xml. Drugi obiekt PropertySourcesPlaceholderConfigurer w pliku xml rozpoznaje plik MyApps-local.properties, ale wysyła jedynie symbol zastępczy procesu w kontekście aplikacji root

Fabryczne procesory post bean mają zakres zależny od kontekstu aplikacji.

Zmień kontekst aplikacji internetowej, aby określić źródło właściwości. Spowoduje to dodanie właściwości do pliku do środowiska

@Configuration
@PropertySource("classpath:MyApps-local.properties")
public class WebConfig{
@Autowired
private Environment env;

@RequestMapping(value = "myProp", method = RequestMethod.GET)
public @ResponseBody String getMyProp(){
return "The prop is:" + env.getProperty("myProp");
}
}

W takim przypadku nie potrzebujesz PropertySourcesPlacheholder, ponieważ możesz wyszukiwać właściwości w środowisku. Następnie zachowaj plik applicationContext.xml w niezmienionej postaci

Będzie także działał z PropertySourcesPlaceholder @Bean, ponieważ pobiera również właściwości z otoczenia. Jednak abover jest czysty niż poniżej

@Configuration
@PropertySource("classpath:MyApps-local.properties")
public class WebConfig{

@Value("${myProp}")
private String myProp;

@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}

@RequestMapping(value = "myProp", method = RequestMethod.GET)
public @ResponseBody String getMyProp(){
return "The prop is:" + myProp;
}
}

0 dla odpowiedzi № 3

Sprawdź, czy to pomaga

  1. Możesz dalej używać tego tagu util w konfiguracji xml

<util:properties id="appConfigProperties" location="location to your properties file" /> <context:property-placeholder properties-ref="appConfigProperties" />

  1. Pochodzi ze schematu http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd

  2. Następnie w kodzie, w którym chcesz wartość z pliku właściwości, użyj go jako

@Value („$ {myPropl}”)
prywatny ciąg str;

działa dla mnie, daj mi znać, jeśli gdzieś utknąłem :)


-1 dla odpowiedzi № 4

Przeczytaj uważnie to http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files

W trybie deweloperskim użyj właściwości specyficznych dla profilu