【发布时间】:2013-11-14 11:34:06
【问题描述】:
我是春季安全的新手。我看过很多关于如何通过外部属性文件中的注释注入值的帖子。我尝试了很多方法,但我总是以 java.lang.IllegalArgumentException: Could not resolve placeholder '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(...) 注释。
假设我想保护一个名为“更新”的方法。当且仅当 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']} 没有被计算。
我在注入值时是否犯了任何错误?当我注释成员变量时它起作用了,但在这里不起作用。请问有什么想法吗?提前致谢。
【问题讨论】:
-
显示整个上下文。
-
小小猜测,你的占位符是在
ContextLoaderListener加载的上下文中定义的,而你的@Controller 是由DispatcherServlet加载的。Bean(Factory)PostProcessor仅在它定义的上下文中运行(PropertyPlaceholderConfigurer就是这样一个 bean)。
标签: spring spring-security annotations