2017-01-14 6 views
1

Я пытаюсь создать консольное приложение с Spring framework.Spring and @Value аннотация

У меня есть класс аннотированный @SpringBootApplication:

@SpringBootApplication 
public class LoaderApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(LoaderApplication.class, args); 
    } 
} 

И класс аннотированный @Component

@Component 
public class ElasticLoader implements CommandLineRunner { 

    // Elastic properties 
    @Value("${elasticTransportAddress:#{null}}") 
    private String elasticTransportAddress; 

    private static final Logger log = LoggerFactory.getLogger(ElasticLoader.class); 

    @Override 
    public void run(String... arg) throws Exception { 
     if (!(elasticTransportAddress != null && elasticTransportAddress.isEmpty())) { 
      log.error("[elasticTransportAddress] is not defined in property file"); 
      return; 
     } 
     log.info("-> ElasticLoader.run"); 
    } 
} 

Как вы можете видеть, в этом классе я пытаюсь придать свойству elasticTransportAddress значение по @Value аннотацию , но после запуска моего приложения я вижу, что свойство elasticTransportAddress остается неназначенным.

Что я пропустил?

Позвольте мне добавить несколько заметок:

Я хочу использовать приложение с различными файлами свойств. В этом случае я создал xml-context-config.xml с таким содержанием:

<beans profile="companies"> 
    <!-- allows for ${} replacement in the spring xml configuration from the 
     application-default.properties, application-dev files on the classpath --> 
    <context:property-placeholder 
      location="classpath:companies.properties" 
      ignore-unresolvable="true" /> 

    <!-- scans for annotated classes in the com.env.dev package --> 
    <context:component-scan base-package="ru.alexeyzhulin" /> 
</beans> 

и использовать конфигурационный файл companies.properties, который я поместил в

enter image description here

Моя конфигурация запуска с описанным профиля:

enter image description here

И этот профиль включен, так как I c ульд видеть в журналах приложения:

2017-01-15 00:10:39.697 INFO 10120 --- [   main] ru.alexeyzhulin.LoaderApplication  : The following profiles are active: companies 

Но когда я определяю свойство в application.properties и использовать профиль по умолчанию, свойство elasticTransportAddress становится назначено.

+0

Ваш класс ElasticLoader определяется как весенний боб? –

+0

Нет, это не так. Не могли бы вы привести пример, как это сделать? –

+1

@SasiKathimanda, если это аннотируется как '@ Component', то это должен быть весенний боб ... –

ответ

2

переименовать company.properties в application-companies.properties. Link к документации

+0

OMG, Он работает. Но почему я не могу назвать свой файл свойств, как хотелось бы, но с помощью специального шаблона 'application-XXX.propreties'? Где я могу прочитать об этом? Спасибо BTW –

+0

Вы можете прочитать об этом в документации Spring [link] (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features -Внешняя-конфигурация-профиль-специфическое-свойство) – LifeIsGoodMF

3

У вас есть ошибка в состоянии if. Это:

if (!(elasticTransportAddress != null && elasticTransportAddress.isEmpty())) 

эквивалентно следующему:

if (elasticTransportAddress == null || !elasticTransportAddress.isEmpty()) 

Таким образом, вы получите сообщение журнала ошибок + возвращение в двух случаях:

  1. Если свойство не определено ИЛИ
  2. Если свойство определено, и его значение не пусто.

Исправление состоит в том, чтобы переписать условие if, например.

if (elasticTransportAddress == null || elasticTransportAddress.isEmpty()) 

Update 1: Вы, конечно, нужно, чтобы убедиться, что это значение действительно определяется в свойствах приложения.


Update 2: Файл xml-context-config.xml не используется Spring вообще. Рекомендованным способом является использование конфигурации на основе аннотаций с помощью @SpringBootApplication. Вы можете сделать это , удаляя xml-context-config.xml полностью и , создавая класс, аннотированный с @Configuration. Этот класс конфигурации может включать аннотации, которые определяют источники собственности. Например .:

@Configuration 
@Profile("companies") 
@PropertySource("classpath:companies.properties") 
public final class LoaderApplication { 
} 

Обратите внимание, что вы не необходимо явно включить @ComponentScan, если вы используете @SpringBootApplication.

+0

Но с условием 'if (elasticTransportAddress == null)' Я получил тот же результат –

+0

ok; где вы определили фактическое свойство? (см. [Документ, описывающий порядок источников поиска свойств] (https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html)) –

+0

I ' я модифицировано мой вопрос. Кажется, что свойство в файле application.properties по умолчанию работает нормально, но в другом файле не –

1

Как сказал другой @Alex, вы должны сообщить Spring, откуда вы хотите получить эти свойства. То, что вы здесь не хватает еще одна конфигурация, и в вашем случае (на основе аннотаций конфигурации) вы должны добавить этот класс:

@Configuration 
public class MyConfiguration { 

    @Bean 
    public PropertyPlaceholderConfigurer getCompanyConfigurer() throws IOException { 

     PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer(); 
     configurer.setLocations(new ClassPathResource("classpath:companies.properties")); 
     configurer.setIgnoreUnresolvablePlaceholders(true); 

     return configurer; 
    } 

} 

Update:

Если вы используете конфигурацию на основе XML вы должны сообщить Spring Boot, что такое конфигурация XML, удаляющая аннотацию @SpringBootApplication в LoaderApplication и добавив XML к SpringApplication таким образом:

SpringApplication.run("classpath:application-configuration.x‌​ml", args); 

Наконец, добавьте эту строку в XML:

<context:property-placeholder ignore-unresolvable="true" location="classpath:companies.properties"/> 

И это все, надеюсь, что это помогло.