Класс @Configuration с пустым значением @Value - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть приложение Maven Spring Boot с внешней конфигурацией.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

У меня есть класс конфигурации с аннотацией @PropertySource, который использует @Value и Environment:

@Configuration
@PropertySource("file:/etc/koshka/application.properties")
public class Config 
{
    @Autowired
    private Environment env;

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

    @Value("${socmess.pass}")
    private String pass;

    public String getUser() {
        return env.getProperty("socmess.user");
    }

    public String getPass() {
        return pass;
    }
}

В двух словах, мне нужен только @Value, но я также протестировал Environment вариант.

У меня есть файл конфигурации в соответствующей папке:

$ cat /etc/koshka/application.properties 
socmess.user="testuser"
socmess.pass="testpass"

В контроллере я создаю конфигурацию:

@RestController
public class Sender {
    private final Logger logger;

    public Sender() 
    {
        logger = (Logger)LogManager.getLogger("KoshkaBot");
    }

    @GetMapping("/vk")
    @CrossOrigin(origins = "*")
    public ResponseEntity<String> vk(
        @RequestParam(value="username") String username,
        @RequestParam(value="password") String password
    ) {
        Config conf = new Config();

        logger.info(conf.getUser());
        logger.info(conf.getPass());

        return ResponseEntity.ok().body("OK");
    }
}

К сожалению, я вижу null s в журнале.

1 Ответ

0 голосов
/ 26 апреля 2018

Не создавать new Config() объект. Этот управляется пружинным контейнером, и вам, как правило, следует добавить его.

Recap

Spring - это структура внедрения зависимостей, означающая, что если вам нужна некоторая зависимость, она предоставляется вам контейнером, и вы не должны ее создавать. Эти зависимости, как правило, являются бобами Spring, объектами, которые Spring знают, как создавать и управлять ими.

Вернуться к нам @Configuration - это аннотация, используемая пружиной для определения bean-компонентов посредством аннотации @Bean, которая впоследствии может использоваться другими компонентами с помощью аннотации @Inject. Что я хотел бы сделать, это определить pojo как:

public class User(){
   private String username;
   private String password;

   //getters,setters etc ...
}

, а затем в классе Config определить bean-компонент следующим образом:

@Bean
public User getUser(){
   //..load user and password
   return new User(user, password);
}

и, наконец, когда вам нужно использовать пользователя, вы можете сделать:

@Inject User user;
//now the properties will be not-null
...