我有一个在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;
}
答案 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();