一次艰难的spring boot自定义配置问题

出发点

我想要在项目中配置一个跨域,其中跨域的的域名,我希望根据不同的profile使用不同的域名,这样部署的时候就不用改了。出于这个目的,我在application配置文件中自定义了跨域的域名,然而我没想到的是,这个问题花了我一个小时才解决,记录一下,防止以后再犯这个错误。

初始配置

测试:dev.yml

test:
     project:
          origins:
               - *

生产:product.yml

test:
     project:
          origins:
               - http://test.project.com
                - http://pre-test.project.com

使用的地方:

@Value("${test.project.origins}")
private String origins;

第一个错误

因为部署环境的问题,部署一次大概需要7-8分钟。
第一次部署的时候就报了错误:
原来的日志找不到了,大概如下:

      
test:
     project:
          origins:
               - *   // yaml语法报错     

星号无法处理,这个符号在yaml语法中是特殊符号,我真的是没想到这个问题,因为之前配置spring boot的相关配置的时候见过星号。所以只能找yaml如何处理特殊字符的说明文档,然而没找到,只在博客中看到又说用小括号或者单引号的,如下:

      
test:
     project:
          origins:
               -  '*'     
      
test:
     project:
          origins:
               -  (*)

因为时间问题,我没有尝试这种配置有没有问题,但是我没有采用这种配置方式,而是使用下面的配置:

      
test:
     project:
          origins:
               -  "*"

第二个错误

改成上面的配置后,我以为可以,结果再次尝试启动的时候,又报了下面这个错误:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'XXX' in value "${XXXt}"
 at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:172)
 at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:124)

后来发现如果只是普通的自定义变量这样写是没问题的,但是如果是集合或者数这样写是会报错的,因为时间问题没有分析源码为什么会报错。我只好把配置改成配置类的形式如下:

@Configuration
@ConfigurationProperties(prefix = "test.project")
public class OriginsConfig {

    private String[] origins;

    public String[] getOrigins() {
        return origins;
    }

    public void setOrigins(String[] origins) {
        this.origins = origins;
    }
}

使用的地方改为:

@Resource
private OriginsConfig originsConfig;

originsConfig.getOrigins();

这样就可以正常使用了。

总结

因为测试环境的问题,导致没测试一次就要花7-8分钟,本来以为一个小问题很快就解决了,实际上却花了一个多小时,下次再学习新知识的时候要注意细节,减少此类的出现。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章