@ConfigurationProperties 注解使用


@ConfigurationProperties 注解使用

参考

@ConfigurationProperties 注解使用姿势,这一篇就够了

使用@ConfigurationProperties注解的要点

  • 引入依赖spring-boot-configuration-processor

  • 被注解的类是被注册到了Spring容器中的Bean。

    方式一:@Component等组件注解和@ComponentScan组合,将组件注入Spring容器成为Bean。

    方式二:@EnableConfigurationProperties({KeyWordConfig.class})注解。

  • 被注解的属性有set方法。

  • 使用@ConfigurationProperties注解和@Value注解

  • yml中键如果有特殊字符,可以使用引号括起来,如果有特殊字符注意转义。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

@ConfigurationProperties注解实战

java代码配置springboot静态资源目录

参考mybatis-plus的crown项目

server:
  port: 80
mozq:
# resource-map对应属性为resourceMap,连字符被去掉,连字符后面的首字母变大写了。
  resource-map:
    [/file/**]: "file:D:/00/00/"
    [/img/**]: "file:D:/00/02/"
package com.mozq.boot.swagger01.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.LinkedHashMap;

@Data
@ConfigurationProperties(prefix = MozqProperties.MOZQ_PREFIX)
public class MozqProperties {
    public static final String MOZQ_PREFIX = "mozq";
    private LinkedHashMap<String, String> resourceMap;
}
package com.mozq.boot.swagger01.config;

import com.mozq.boot.swagger01.properties.MozqProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.io.File;

@Configuration
@EnableConfigurationProperties({MozqProperties.class})
public class MozqConfig implements WebMvcConfigurer {

    /*
     这里注入了mozqProperties,但是不清楚原理,因为使用的是@EnableConfigurationProperties({MozqProperties.class})
     MozqProperties对象并不是Spring中的bean。不能用注解直接注入。
      */
    private MozqProperties mozqProperties;
    public static final String USER_DIR = "user.dir";

    public MozqConfig(MozqProperties mozqProperties){
        this.mozqProperties = mozqProperties;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        mozqProperties.getResourceMap().forEach((k,v)->{
            // 因为直接使用"/file/**"会被过滤掉特殊字符,所以加上了中括号"[/file/**]",使用的时候要去除掉。
            String  key = k.substring(1, k.length() - 1);
            registry.addResourceHandler(key).addResourceLocations(v);
            System.out.println(key + "  " + v);
        });
        registry.addResourceHandler("/**").addResourceLocations("file:" + System.getProperty(USER_DIR) + File.separator);
        System.out.println(System.getProperty(USER_DIR));
    }

}

user.dir

package com.mozq.boot.swagger01.demo;

import com.mozq.boot.swagger01.config.MozqConfig;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.File;

@RestController
public class DemoController {
    /**
     * springboot中"user.dir"属性得到的是jar包执行时,jar包所在的目录的磁盘路径,末尾不带文件分隔符。
     * 如:jar包被放在"D:\Adobe",则 System.getProperty("user.dir")得到的磁盘路径就是"D:\Adobe"
     * @return
     */
    @RequestMapping("/userDir")
    public String userDir(){
        String userDir = System.getProperty(MozqConfig.USER_DIR) + File.separator;
        return userDir;
    }

    @RequestMapping("/realPath")
    public String realPath(HttpServletRequest request){
        String realPath = request.getServletContext().getRealPath("");
        return realPath;
    }
}
package com.mozq.freemarker.freemarker01.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@ConfigurationProperties(prefix = "wechat")
@Data
public class KeyWordConfig {
    @Value("keywordxxx")
    private String keyword;//注入常量值:keywordxxx

    @RequestMapping("/demo")
    public String demo(){
        System.out.println(keyword);
        return keyword;
    }

    @Value("${xhpay.front}")
    private String xhpay;

    @RequestMapping("/demo2")
    public String demo2(){
        System.out.println(xhpay);
        return xhpay;
    }

    @Value("${///}")
    private String demo;
    @RequestMapping("/demo3")
    public String demo3(){
        System.out.println(demo);
        return demo;
    }

    @Value("${/account/tomcat:::\\\\}")
    private String tomcat;
    @RequestMapping("/demo4")
    public String demo4(){
        System.out.println(tomcat);
        return tomcat;
    }
    
}
"///": changzhou
"/account/delete": authc
"/account/tomcat:::\\\\": "<html>\"
                    <head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /></head>
                    <body>
                        <p style='text-align:center;font-size: 48px;font-weight: bold;'>外卖前台联</p>

                        <p style='text-align:center;font-size: 48px;font-weight: bold;'>餐桌号:123</p>

                    <p style='Width:100%;text-align: left;font-weight: bold;'>支付时间:20191227143600320 </p>
                    <p style='Width:100%;text-align: left;font-weight: bold;'>支付状态:已支付</p>
                    </body>
                    </html>"

依赖和文件

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
##jwt配置
audience:
  # 代表这个JWT的接收对象,存入audience
  clientId: 098f6bcd4621d373cade4e832627b4f6
  # 密钥, 经过Base64加密, 可自行替换
  base64Secret: MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY=
  # JWT的签发主体,存入issuer
  name: restapiuser
  # 过期时间,时间戳
  expiresSecond: 172800

测试

package com.mozq.sb.jwt01.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @description:
 * @author: changzhou.xie@yuantiaokj.com
 * @date: 2019/10/24 15:59
 */
@ConfigurationProperties("audience")
//@ConfigurationProperties(prefix = "audience", ignoreInvalidFields = true)
/*
@ConfigurationProperties 注解的bean必须先是spring中注册的bean。
如果不是则可以使用 @EnableConfigurationProperties(Audience.class) 来注册这个类。
或者使用@Component等组件将这个bean注册到spring中
@Import注解
*/
//@EnableConfigurationProperties(Audience.class)
@RestController
@Data
public class Audience {
    String clientId;
    String base64Secret;
    String name;
    String expiresSecond;
    String password;//没有对应属性的则会是null。
    /*
    Failed to bind properties under 'audience' to com.mozq.sb.jwt01.config.Audience:

    Property: audience.clientid
    Value: 098f6bcd4621d373cade4e832627b4f6
    Origin: class path resource [application.yml]:6:13
    Reason: No setter found for property: client-id
     */

    @RequestMapping("/clientId")
    public String clientId(){
        System.out.println(clientId);
        System.out.println(base64Secret);
        System.out.println(name);
        System.out.println(expiresSecond);
        return clientId;
        /* 运行结果:
        098f6bcd4621d373cade4e832627b4f6
        MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY=
        restapiuser
        172800
         */
    }
}

@ConfigurationProperties

public @interface ConfigurationProperties {

	@AliasFor("prefix")
	String value() default "";
	/**
	 * The prefix of the properties that are valid to bind to this object. Synonym for
	 * {@link #value()}. A valid prefix is defined by one or more words separated with
	 * dots (e.g. {@code "acme.system.feature"}).
	 * @return the prefix of the properties to bind
	 */
	@AliasFor("value")
	String prefix() default "";

	/**
	 * Flag to indicate that when binding to this object invalid fields should be ignored.
	 * Invalid means invalid according to the binder that is used, and usually this means
	 * fields of the wrong type (or that cannot be coerced into the correct type).
	 * @return the flag value (default false)
	 * 是否忽略无效的字段,如果比如无法进行类型转换,则默认不忽略将报错。
	 */
	boolean ignoreInvalidFields() default false;

	/**
	 * Flag to indicate that when binding to this object unknown fields should be ignored.
	 * An unknown field could be a sign of a mistake in the Properties.
	 * @return the flag value (default true)
	 */
	boolean ignoreUnknownFields() default true;

}

bugs

Failed to bind properties under 'audience.expires-second' to java.util.Date:

    Property: audience.expiressecond
    Value: 172800
    Origin: class path resource [application.yml]:12:18
    Reason: No converter found capable of converting from type [java.lang.Integer] to type [java.util.Date]


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM