@ConfigurationProperties 不适用于 .YAML 文件

use*_*104 5 java spring-boot

我是 SpringBoot 的新手,并尝试使用内置的 SpringBoot 注释从 YML 文件中读取属性。

以下是代码:

应用程序属性.java

@Component
@ConfigurationProperties(prefix = "patterns")
public class AppProperties {

    private List<PasswordPattern> password_patterns = new ArrayList<>();

    public static class PasswordPattern {
        private String pattern1;

        @Autowired
        public String getPattern1() {
            return pattern1;
        }

        public void setPattern1(String pattern1) {
            this.pattern1 = pattern1;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

调用 AppProperties 的测试类

测试1.java

public class Test1 {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
        // TODO Auto-generated method stub

        AppProperties.PasswordPattern a = new AppProperties.PasswordPattern();

        System.out.println(a.getPattern1());
    }

}
Run Code Online (Sandbox Code Playgroud)

application.yml 文件

--- 
patterns: 
  password_patterns: 
  pattern1: "test"
Run Code Online (Sandbox Code Playgroud)

期望: getPattern1() 方法应该返回从 yml 文件读取的值

我参考了很多关于此类问题的帖子,但不明白我犯了什么错误。我错过了任何特定的注释吗?我很红

@Autowired

它与依赖注入有关,我也使用过......请建议

进一步编辑:

在关注“Alexander Pinkin”的帖子后,出现以下错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'patterns.password-patterns' to java.util.Map<ja
va.lang.String, java.lang.String>:

    Reason: No converter found capable of converting from type [java.lang.String
] to type [java.util.Map<java.lang.String, java.lang.String>]

Action:

Update your application's configuration
Run Code Online (Sandbox Code Playgroud)

进一步编辑2:

应用程序属性.java

@Component
@ConfigurationProperties(prefix = "patterns")
public class AppProperties {

    private List<Menu> menus = new ArrayList<>();

    public static class Menu {
        private String pattern1;

        public String getPattern1() {
            return pattern1;
        }

        public void setPattern1(String pattern1) {
            this.pattern1 = pattern1;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

密码patApplication.java

@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class PasswordpatApplication {

    private static final Logger LOG = LoggerFactory.getLogger(PasswordpatApplication.class);

    @Autowired
    public static void main(String[] args) {
        SpringApplication.run(PasswordpatApplication.class, args);

        AppProperties.Menu a = new AppProperties.Menu();
        LOG.info("hi");
        LOG.info(a.getPattern1());

    }
Run Code Online (Sandbox Code Playgroud)

应用程序.yml

patterns: 
  password-patterns: 
  pattern1: test
Run Code Online (Sandbox Code Playgroud)

输出:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.4.RELEASE)

2018-08-24 18:56:21.116  INFO 11712 --- [           main] c.e.passwordpat.Passwo
rdpatApplication   : Starting PasswordpatApplication v0.0.1-SNAPSHOT on PUNITP13
0066L with PID 11712 (C:\Users\irfan.sayed\Downloads\passwordpat\target\password
pat-0.0.1-SNAPSHOT.jar started by irfan.sayed in C:\Users\irfan.sayed\Downloads\
passwordpat\target)
2018-08-24 18:56:21.131  INFO 11712 --- [           main] c.e.passwordpat.Passwo
rdpatApplication   : No active profile set, falling back to default profiles: de
fault
2018-08-24 18:56:21.271  INFO 11712 --- [           main] s.c.a.AnnotationConfig
ApplicationContext : Refreshing org.springframework.context.annotation.Annotatio
nConfigApplicationContext@6c629d6e: startup date [Fri Aug 24 18:56:21 IST 2018];
 root of context hierarchy
2018-08-24 18:56:22.066  WARN 11712 --- [           main] f.a.AutowiredAnnotatio
nBeanPostProcessor : Autowired annotation is not supported on static methods: pu
blic static void com.example.passwordpat.PasswordpatApplication.main(java.lang.S
tring[])
2018-08-24 18:56:23.887  INFO 11712 --- [           main] o.s.j.e.a.AnnotationMB
eanExporter        : Registering beans for JMX exposure on startup
2018-08-24 18:56:23.920  INFO 11712 --- [           main] c.e.passwordpat.Passwo
rdpatApplication   : Started PasswordpatApplication in 3.484 seconds (JVM runnin
g for 4.104)
2018-08-24 18:56:23.929  INFO 11712 --- [           main] c.e.passwordpat.Passwo
rdpatApplication   : hi
2018-08-24 18:56:23.931  INFO 11712 --- [           main] c.e.passwordpat.Passwo
rdpatApplication   : null
2018-08-24 18:56:23.938  INFO 11712 --- [       Thread-2] s.c.a.AnnotationConfig
ApplicationContext : Closing org.springframework.context.annotation.AnnotationCo
nfigApplicationContext@6c629d6e: startup date [Fri Aug 24 18:56:21 IST 2018]; ro
ot of context hierarchy
2018-08-24 18:56:23.946  INFO 11712 --- [       Thread-2] o.s.j.e.a.AnnotationMB
eanExporter        : Unregistering JMX-exposed beans on shutdown
Run Code Online (Sandbox Code Playgroud)

现在,控制台上没有打印任何内容。没有任何错误或异常

请建议

Ale*_*kin 1

您应该启动 Spring 上下文并将您的属性命名为“password-patterns”或“passwordPatterns”。

这应该有效:

应用程序属性.java:

@ConfigurationProperties(prefix = "patterns")
public class AppProperties {

    private Map<String, String> passwordPatterns = new HashMap<>();

    public Map<String, String> getPasswordPatterns() {
        return passwordPatterns;
    }
}
Run Code Online (Sandbox Code Playgroud)

演示应用程序.java

@SpringBootApplication
@EnableConfigurationProperties(AppProperties.class)
public class DemoApplication implements CommandLineRunner {
    private static final Logger LOG = LoggerFactory
            .getLogger(DemoApplication.class);

    @Autowired
    private AppProperties appProperties;

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

    @Override
    public void run(String... args) {
        LOG.info("pattern = {}", appProperties.getPasswordPatterns().get("pattern1"));
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序.yml

patterns:
  password-patterns:
    pattern1: "test"
Run Code Online (Sandbox Code Playgroud)