GVKun编程网logo

@ConfigurationProperties前缀不起作用(@configurationproperty)

11

本文将介绍@ConfigurationProperties前缀不起作用的详细情况,特别是关于@configurationproperty的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面

本文将介绍@ConfigurationProperties前缀不起作用的详细情况,特别是关于@configurationproperty的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于@Configuration+@ConfigurationProperties+@EnableConfigurationProperties、@ConfigurationProperties、@ConfigurationProperties + @EnableConfigurationProperties、@ConfigurationProperties 与 @value 区别的知识。

本文目录一览:

@ConfigurationProperties前缀不起作用(@configurationproperty)

@ConfigurationProperties前缀不起作用(@configurationproperty)

.yml文件

cassandra:    keyspaceApp:junitsolr:    keyspaceApp:xyz

@Component@ConfigurationProperties(prefix="cassandra")public class CassandraClientNew {   @Value("${keyspaceApp:@null}") private String keyspaceApp;

主要方法文件

@EnableAutoConfiguration@ComponentScan@PropertySource("application.yml")public class CommonDataApplication {    public static void main(String[] args) {        ConfigurableApplicationContext context = new SpringApplicationBuilder(CommonDataApplication.class)                .web(false).headless(true).main(CommonDataApplication.class).run(args);    }}

测试用例

@RunWith(SpringJUnit4ClassRunner.class)@SpringApplicationConfiguration(classes = CommonDataApplication.class)@IntegrationTest@EnableConfigurationPropertiespublic class CassandraClientTest {    @Autowired    CassandraClientNew cassandraClientNew;    @Test    public void test(){        cassandraClientNew.getSession();        System.out.println(" **** done ****");    }}

代替将junit设置为keyspaceApp,而是设置xyz。

看起来像前缀=“ cassandra”不起作用

答案1

小编典典

看来您正在尝试使用Spring Boot Typesafe配置属性功能。

因此,为了使其正常工作,您必须对代码进行一些更改:

首先,您的CommonDataApplication班级应该有@EnableConfigurationProperties注解,例如

@EnableAutoConfiguration@ComponentScan@PropertySource("application.yml")@EnableConfigurationPropertiespublic class CommonDataApplication {    public static void main(String[] args) {        // ...    }}

我不认为您需要@PropertySource("application.yml")注释,因为application.yml(以及application.propertiesapplication.xml)是Spring
Boot使用的默认配置文件。

您的CassandraClientNew课程无需具有@Value注释前缀keyspaceApp属性。而且您keyspaceApp
必须有一个setter方法

@Component@ConfigurationProperties(prefix="cassandra")public class CassandraClientNew {   private String keyspaceApp;   public void setKeyspaceApp(final String keyspaceApp) {       this.keyspaceApp = keyspaceApp;   }}

顺便说一句,如果您使用ListSet且初始化了集合(例如List<String> values = newArrayList<>();),则仅需要getter。如果未初始化集合,则还需要提供setter方法(否则将引发异常)。

我希望这会有所帮助。

@Configuration+@ConfigurationProperties+@EnableConfigurationProperties

@Configuration+@ConfigurationProperties+@EnableConfigurationProperties

 @Configuration+@ConfigurationProperties+@EnableConfigurationProperties

 

 

最佳设计方案(现在又改板了):

Bean上面直接设置@ConfigurationProperties

//需要依赖spring-boot-configuration-processor

@ConfigurationProperties(prefix = "stu")

public class Stu {

    String name;

 

    public Stu(String name) {

        this.name = name;

    }

 

    public Stu() {

    }

 

    public String getName() {

        return name;

    }

 

    public void setName(String name) {

        this.name = name;

    }

 

    @Override

    public String toString() {

        return "Stu{" +

                "name=''" + name + ''\'''' +

                ''}'';

    }

}

方式一:configuration上面跟随@EnableConfigurationProperties【这种情况只有configuration里面一个Bean 】

@Configuration

@EnableConfigurationProperties

public class StuConfiguration {

    @Bean

    public Stu stu(){

        return  new Stu();

    }

}

方式二:configuration上面跟随@EnableConfigurationProperties【这种情况只有configuration里面一个Bean 】

package com.example.demo11.configuration;

import com.example.demo11.entity.Stu;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

//@EnableConfigurationProperties(Stu.class),如果携带class参数则有用注册Bean的能力,

//因为实现了ImportBeanDefinitionRegistrar接口,Import三插之一

//这里的Bean名称非常有意思【类型名称+全包名】

@EnableConfigurationProperties(Stu.class)

public class StuConfiguration {

    @Bean

    public Stu stu2(){

        return  new Stu();

    }

}

启动查看

@SpringBootApplication

public class Demo11Application {

    public static void main(String[] args) {

        ConfigurableApplicationContext context = SpringApplication.run(Demo11Application.class, args);

        Stu stu = context.getBean("stu-com.example.demo11.entity.Stu", Stu.class);

        System.out.println(context.getBeansOfType(Stu.class).size());

        System.out.println(stu.toString());

        context.close();

    }

 

}

@ConfigurationProperties

@ConfigurationProperties

有时候有这样子的情景,我们想把配置文件的信息,读取并自动封装成实体类,这样子,我们在代码里面使用就轻松方便多了,这时候,我们就可以使用@ConfigurationProperties,它可以把同类的配置信息自动封装成实体类

首先在配置文件里面,这些信息是这样子滴

connection.username=admin
connection.password=kyjufskifas2jsfs
connection.remoteAddress=192.168.1.1

这时候我们可以定义一个实体类在装载配置文件信息

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {

    private String username;
    private String remoteAddress;
    private String password ;

    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getRemoteAddress() {
        return remoteAddress;
    }
    public void setRemoteAddress(String remoteAddress) {
        this.remoteAddress = remoteAddress;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }

}

我们还可以把@ConfigurationProperties还可以直接定义在@bean的注解上,这是bean实体类就不用@Component和@ConfigurationProperties了

@SpringBootApplication
public class DemoApplication{

    //...

    @Bean
    @ConfigurationProperties(prefix = "connection")
    public ConnectionSettings connectionSettings(){
        return new ConnectionSettings();

    }

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

然后我们需要使用的时候就直接这样子注入

@RestController
@RequestMapping("/task")
public class TaskController {

@Autowired ConnectionSettings conn;

@RequestMapping(value = {"/",""})
public String hellTask(){
    String userName = conn.getUsername();     
    return "hello task !!";
}

}

如果发现@ConfigurationPropertie不生效,有可能是项目的目录结构问题,

你可以通过@EnableConfigurationProperties(ConnectionSettings.class)来明确指定需要用哪个实体类来装载配置信息

@Configuration
@EnableConfigurationProperties(ConnectionSettings.class)
 public class MailConfiguration { 
    @Autowired private MailProperties mailProperties; 

    @Bean public JavaMailSender javaMailSender() {
      // omitted for readability
    }
 }

 

@ConfigurationProperties + @EnableConfigurationProperties

@ConfigurationProperties + @EnableConfigurationProperties

1、ConfigurationProperties

在类上通过@ConfigurationProperties注解声明当前类为属性读取类。

举例:

@ConfigurationProperties(prefix = "jdbc")

prefix="jdbc" 读取属性文件中,前缀为jdbc的值。

在类上定义各个属性,名称必须与属性文件中 jdbc. 后面部分一致。

需要注意的是,如果我们没有指定属性文件的地址,SpringBoot 默认读取 application.properties/application.yml  中的属性文件名。

@Data
@ConfigurationProperties(prefix = "jdbc")
class JdbcProperties {

    private String url;
    private String driverClaprivate;
    private String username;
    private String password;
}

 

2、EnableConfigurationProperties

@ConfigurationProperties 注解我们可以理解成用来把 properties 配置文件转化为 Bean 使用的,而 @EnableConfigurationProperties 注解的作用是让 @ConfigurationProperties 注解生效。

如果只配置 @ConfigurationProperties 注解,在 IOC 容器中是获取不到 properties 配置文件转化的 Bean 的。

那么我们如何获取我们使用了 @ConfigurationProperties 注解的类呢?

2.1 @Autowired 注入

@Autowired
private JdbcProperties prop;

2.2 构造函数注入

private JdbcProperties prop;
public JdbcConfig(Jdbcproperties prop){
  this.prop = prop;
}

2.3 声明有@Bean的方法参数注入

@Bean
public TestBean dataSource(JdbcProperties jdbcProperties) {
    syso(jdbcProperties.getUsername());// syso 简写
    return new TestBean;
}

通过上方三种方式,都可以在 JdbcProperties jdbcProperties 中直接拿到注入的数据。

 

@ConfigurationProperties 与 @value 区别

@ConfigurationProperties 与 @value 区别

@ConfigurationProperties 与 @value 区别

 

@ConfigurationProperties

@value

功能 批量注入配置文件中的属性 一个个指定 松散绑定 支持 不支持 SpEl 不支持 支持 JSR303 数据校验  支持  不支持 复杂类型封装 支持 不支持

 

 

 

 

  •  只是在某个业务逻辑中获取一下配置的某些值,使用 @Value

  • 专门编写一个 javaBean 来和配置文件进行映射,我们就直接使用 @ConfigurationProperties

 

package com.hoje.springboot.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class helloController {
    @Value("${person.last-name}")
    private String name;
    @RequestMapping("/sayHello")
    public String sayHello(){
        return "Hello "+ name;
    }
}

 

 

关于@ConfigurationProperties前缀不起作用@configurationproperty的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于@Configuration+@ConfigurationProperties+@EnableConfigurationProperties、@ConfigurationProperties、@ConfigurationProperties + @EnableConfigurationProperties、@ConfigurationProperties 与 @value 区别等相关知识的信息别忘了在本站进行查找喔。

本文标签: