Как получить статическое конечное свойство из файла свойств с весенней загрузкой - PullRequest
0 голосов
/ 20 сентября 2018

У меня весенний загрузочный проект, работающий на базе данных mysql.Чтобы зашифровать какой-то столбец, я использовал функции mysql aes_encrypt, aes_decrypt и сохранил свой secret_key в файле свойств.Теперь, чтобы сделать некоторый запрос к базе данных, я должен использовать в 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 голосов
/ 20 сентября 2018

Вы можете создать для этой константы, как показано ниже.

   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();
...