我是春天安全新手。我已经看过很多关于如何通过外部属性文件中的注释注入值的帖子。我尝试了很多方法,但我总是最终得到java.lang.IllegalArgumentException:无法解决占位符'val.id'异常。
您能否提供一些如何处理此例外的提示?
我的java类如下:
@Controller
public class Employee {
@Value("${val.id}")
public String valId;
public String getValId() {
return valId;
}
public void setValId(String valId) {
this.valId = valId;
}
我的属性文件名为val.properties,位于WEB-INF下,其内容为 val.id = XYZ
我将以下内容放在我的主上下文bean中。
<context:property-placeholder location="/WEB-INF/*.properties" />
<bean id="valProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/val.properties"/>
A continuous question:
当我接受上面的答案时,从属性文件到带注释的bean的注入值工作正常。但是,我无法通过遵循相同的过程将它注入@PreAuthorize(...)注释。
假设我想要保护一个名为'update'的方法。当且仅当valId等于empId时,才允许使用此方法。 valId和empId的值在val.properties文件中初始化。
我的java bean是:
public class Employee {
public String valId;
public String empId;
public String getValId() {
return valId;
}
public void setValId(String valId) {
this.valId = valId;
}
public String getEmpId() {
return empId;
}
public void setEmpId(String empId) {
this.empId = empId;
}
}
我的属性文件包含: val.id = NN emp.id = NN
我在主要上下文文件中有占位符配置:
<context:property-placeholder location="/WEB-INF/*.properties" />
<bean id="valProp" class="org.springframework.beans.factory.config.PropertiesFactoryBean"
p:location="/WEB-INF/val.properties"/>
我的PreAuthorize注释(方法安全性)是:
@PreAuthorize("(#{valProp['val.id']} == #{valProp['emp.id']})")
public boolean update(){
//if accessable
return true;
}
但是不评估表达式#{valProp['val.id']} == #{valProp['emp.id']}
。
我是否有任何错误注入价值?当我注释成员变量时它工作,但它在这里不起作用。有什么好主意吗?提前谢谢。
答案 0 :(得分:1)
尝试考虑以下
1)。将注释更改为:
@Value("#{valProp['val.id']}")
2)。将PropertyPlaceholderConfigurer
替换为PropertiesFactoryBean
。
希望这能解决这个异常。
答案 1 :(得分:0)
抛出异常的原因是,因为默认情况下属性占位符会在无法解析值时抛出异常。 此外,您有两个属性占位符,通过它们可能无法解析所有值。
您可以通过设置ignore-unresolvable属性来更改此行为:
<context:property-placeholder location="/WEB-INF/*.properties" ignore-unresolvable="true" />
<bean id="valProp" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/val.properties" p:ignoreUnresolvablePlaceholders="true" />
然而,注意b 将无法检测到属性文件中的此功能拼写错误。