如何使用Spring Boot从属性文件中获取静态最终属性

时间:2018-09-20 10:44:06

标签: mysql sql spring-boot properties spring-data-jpa

我有一个在mysql DB上工作的spring boot项目。为了加密某些列,我使用了mysql函数aes_encrypt,aes_decrypt并将我的secret_key存储在属性文件中。现在要在db上进行一些查询,我必须在crudrepository中使用诸如此类的本机查询。

@Query(value = "select * from a_table at where AES_DECRYPT(at.column1, +StaticClass.KEY+)= 'ABC'", nativeQuery = true)
public List<A>findByParameter();

我收到此错误“注释属性Query.value的值必须为常量表达式”

但是属性KEY已经是以这种方式实例化的FINAL属性

public class StaticClass {

static {

    Properties prop = new Properties();
    InputStream input;
    try {
        input = new FileInputStream("application.properties");
        prop.load(input);
    } catch (IOException e) {
        logger.error("Error");
    }
    if(prop.getProperty("property1")==null) {
        logger.error("property not found");
    }

    KEY=prop.getProperty("property1", "");
}

public static final String KEY;

一种解决方案是将密钥存储在代码中,但是我需要将密钥保留在属性文件中。如何解决这个问题?

已更新1 我也尝试过这种方式

public class StaticClass {

@Value(value="property1")
public static final String KEY;
}

1 个答案:

答案 0 :(得分:0)

您可以像下面这样创建此常量。

   public enum Foo {

    FOO("app.foo"), FOO_BAR("app.foo.bar");

    private Environment environment;

    private final String propertyKey;

    Foo(String propertyKey) {
        this.propertyKey = propertyKey;
    }

    public String getValue() {
        return environment.getProperty(propertyKey);
    }

    private void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    @Component
    private static class EnvironmentInjector {

        @Autowired
        private Environment environment;

        @PostConstruct
        private void postConstruct() {
            for (Foo fT : EnumSet.allOf(Foo.class))
                fT.setEnvironment(environment);
        }
    }
}

然后您可以像这样使用

Foo.FOO.getValue()

@Query(value = "select * from a_table at where AES_DECRYPT(at.column1, +Foo.FOO.getValue()+)= 'ABC'", nativeQuery = true)
public List<A>findByParameter();