场景:
今天有这么几个组配置:
# 自定义配置 经过网关检测 - 键
custom.gateway-key=xsffssVal89
# 自定义配置 经过网关检测 - 值
custom.gateway-value=7qwe4r823fjas
### 排除 - 必走网关检验的链接
# 用户图片
custom.interceptor.exclude[0]=/user/images/**
custom.interceptor.exclude[1]=/goods/images/**
这个配置写@ConfigurationProperties(prefix = "custom")注解显然是不太好取到custom.interceptor.exclude,于是只能在配置类中写@Value注解,但是怎么都是获取为null或者报错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.commonConfiguration': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'custom.interceptor.exclude' in value "${custom.interceptor.exclude}"
解决办法:
在nacos中properties文件数组写法稍有不同,假设你用@Value注解则无法使用写法以上提到的写法,应该改为:
# 自定义配置 经过网关检测 - 键
custom.gateway-key=xsffssVal89
# 自定义配置 经过网关检测 - 值
custom.gateway-value=7qwe4r823fjas
### 排除 - 必走网关检验的链接
# 用户图片、用户图片
custom.interceptor.exclude=/user/images/**,/goods/images/**
附带上配置bean:
package com.wpj.common.configuration;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import lombok.Data;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 获取 ncaso 中 common 设置
*/
@Data
@Component
@RefreshScope
@ConfigurationProperties(prefix = "custom")
public class CommonConfiguration {
private final Log logger = LogFactory.getLog(this.getClass());
/**
* 经过网关检测 - 键
*/
private String gatewayKey;
/**
* 经过网关检测 - 值
*/
private String gatewayValue;
/**
* 排除 - 必走网关检验的链接
*/
@Value("${custom.interceptor.exclude}")
private List<String> interceptorExclude = new ArrayList<>();
}
以上是@ConfigurationProperties注解和@Value注解混合使用方式,假如你将配置改为custom.interceptor-exclude也不用加@Value了,附带上配置bean:
package com.wpj.gateway.config;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* 获取某些 gateway 设置
*/
@Component
@RefreshScope
@ConfigurationProperties("spring.cloud.gateway")
public class GatewayConfig {
private final Log logger = LogFactory.getLog(this.getClass());
private List<String> excludePath = new ArrayList<>();
public List<String> getExcludePath() {
return this.excludePath;
}
public void setExcludePath(List<String> paths) {
this.excludePath = paths;
if (paths != null && paths.size() > 0 && this.logger.isDebugEnabled()) {
this.logger.debug("没有设置排除验证gateway请求路径");
} else {
this.logger.debug("排除请求路径设置为: " + paths);
}
}
}