1

我是春季安全的新手。我看过很多关于如何通过注释从外部属性文件中注入值的帖子。我尝试了很多方法,但我总是以 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']}不评估表达式。

我在注入价值方面做错了吗?当我注释成员变量时它起作用了,但在这里不起作用。请问有什么想法吗?提前致谢。

4

2 回答 2

1

尝试考虑以下

1)。将您的注释更改为:

@Value("#{valProp['val.id']}")

2)。替换PropertyPlaceholderConfigurerPropertiesFactoryBean

希望这将解决异常。

于 2013-11-03T21:53:22.303 回答
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< 在属性文件中关闭此功能的拼写错误。

于 2013-11-03T20:59:06.903 回答