通过注释注入属性

时间:2013-11-03 20:30:09

标签: spring spring-security annotations

我是春天安全新手。我已经看过很多关于如何通过外部属性文件中的注释注入值的帖子。我尝试了很多方法,但我总是最终得到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']}

我是否有任何错误注入价值?当我注释成员变量时它工作,但它在这里不起作用。有什么好主意吗?提前谢谢。

2 个答案:

答案 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 将无法检测到属性文件中的此功能拼写错误。