2016-08-19 10 views
14

У меня есть приложение Spring Boot и в одном из классов я пытаюсь ссылаться на свойство из файла application.properties, используя @Value. Но собственность не решена. Я просмотрел похожие должности и попытался выполнить эти предложения, но это не помогло. Класс:Spring Boot @Value Properties

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class PrintProperty { 

    @Value("${file.directory}") 
    private String fileDirectory; 

    public void print() { 
    System.out.println(fileDirectory); 
    } 
} 

Я имею file.directory собственности в application.properties. У меня есть и другие поля.

+0

Покажите нам ошибку, которую вы принимаете, проверьте мой ответ ниже, он должен работать. – Jesse

ответ

0

Поскольку вы используете Spring boot, единственный способ, по-моему, в настоящее время не работает, потому что вы не добавили аннотацию @PropertySource.

Пожалуйста, попробуйте и дайте мне знать ваши отзывы. Благодаря!

@Configuration 
@ComponentScan 
@PropertySource("classpath:/application.properties") 
@EnableAutoConfiguration 
public class PrintProperty { 

    @Value("${file.directory}") 
    private String fileDirectory; 

    public void print() { 
    System.out.println(fileDirectory); 
    } 
} 
+2

Поскольку это весенняя обувь, есть и другие способы сделать это. Аннотировать основной класс с @SpringBootApplication достаточно – rajadilipkolli

+0

@ user6641655 Вы решили проблему? сообщите нам ваши отзывы об этом? – kukkuz

+0

Я пробовал в обоих направлениях, но не работал. – user6641655

1

Чтобы прочитать значения из application.properties нам нужно просто аннотировать наш основной класс с @SpringBootApplication и класс, где вы читаете с @Component или разновидности этого. Ниже приведен образец, в котором я читал значения от application.properties, и он отлично работает при вызове веб-службы. Если вы разворачиваете тот же код, что и есть, и пытаетесь получить доступ с http://localhost:8080/hello, вы получите значение, которое вы сохранили в application.properties для ключевого сообщения.

package com.example; 

import org.springframework.beans.factory.annotation.Value; 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 

@SpringBootApplication 
@RestController 
public class DemoApplication { 

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

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

    @RequestMapping("/hello") 
    String home() { 
     return message; 
    } 

} 

Try и дайте мне знать

+0

Я пробовал, но это не сработало. Свойства решаются в моем основном классе с помощью аннотации @SpringBootApplication, но не в этом классе. – user6641655

+0

Попробуйте добавить аннотацию @Component к своему классу и дайте мне знать, что произошло – rajadilipkolli

+0

Я пробовал @Component, и это не сработало. – user6641655

2

Убедитесь, что файл application.properties находится под SRC/основные/ресурсы/application.properties. Это один из способов. Затем добавьте @PostConstruct следующим

@ComponentScan 
public class PrintProperty { 

    @Value("${file.directory}") 
    private String fileDirectory; 

    @PostConstruct 
    public void print() { 
    System.out.println(fileDirectory); 
    } 
} 
0

Попробуйте изменить к следующему -

@Configuration 
@ComponentScan 
@EnableAutoConfiguration 
public class PrintProperty { 

    @Autowired 
    Environment environment; 

    public void print() { 
    System.out.println(environment.getProperty("file.directory")); 
    } 
} 

Вы могли бы избавиться от @ComponentScan и @EnableAutoConfiguration, если они уже присутствуют на вас SpringbootApplication класс.

Что касается того, почему @Value не работает, не уверен!

7

У меня была такая же проблема, как и вы. Вот мой код ошибки.

@Component 
public class GetExprsAndEnvId { 
    @Value("hello") 
    private String Mysecret; 


    public GetExprsAndEnvId() { 
     System.out.println("construct"); 
    } 


    public void print(){ 
     System.out.println(this.Mysecret); 
    } 


    public String getMysecret() { 
     return Mysecret; 
    } 

    public void setMysecret(String mysecret) { 
     Mysecret = mysecret; 
    } 
} 

Это не проблема, как это, но мы должны использовать его как это:

@Autowired 
private GetExprsAndEnvId getExprsAndEnvId; 
не

нравится:

getExprsAndEnvId = new GetExprsAndEnvId(); 
+0

Спасибо! У меня была именно эта проблема, и это ее решает. Странная ситуация заключается в том, что Spring проверяет, существует ли свойство (оно выдает ошибку, если оно не определено в файле свойств), но оно не использовало его для заполнения переменной. Теперь это так. – mcv

+0

также решил мою проблему, любая идея, почему это происходит? – gaurav5430

3

Я бы хотел отметить, что я использовал весеннюю версию загрузки 1.4.0, и поскольку эту версию вы можете только написать:

@Component 
public class MongoConnection { 

@Value("${spring.data.mongodb.host}") 
private String mongoHost; 

@Value("${spring.data.mongodb.port}") 
private int mongoPort; 

@Value("${spring.data.mongodb.database}") 
private String mongoDB; 
} 

Затем введите класс, когда захотите.

+0

Почему бы не написать код непосредственно в вашем ответе? – Cyril

0

Вы не включили декларации пакетов в OP, но возможно, что ни @SpringBootApplication, ни @ComponentScan не сканируют ваш @Component.

@ComponentScan В Javadoc состояния:

Либо basePackageClasses или basePackages (или его псевдоним value) может быть указано для определения конкретных пакетов для сканирования. Если определенные пакеты не определены, сканирование будет происходить из пакета класса , который объявляет эту аннотацию.

ISTR тратит много времени на это раньше и нашел, что проще всего просто переместить класс приложения в самый высокий пакет в дереве пакетов моего приложения.

В последнее время я обнаружил, что свойство было прочитано до того, как была выполнена вставка значений. Ответ Джесси помог как @PostConstruct, кажется, самый ранний вы можете прочитать вставленные значения, и, конечно же, вы должны позволить Spring называть это.

Смежные вопросы