【问题标题】:Inject properties via annotation通过注解注入属性
【发布时间】: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


【解决方案1】:

尝试考虑以下事项

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

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

2)。将PropertyPlaceholderConfigurer 替换为PropertiesFactoryBean。

希望这将解决异常。

【讨论】:

  • 为什么你认为这会改变什么?
  • Eyasu 的回答解决了这个问题。它就像一个魅力!非常感谢人:)。
  • 非常感谢大家!如果我想将值注入 @PreAuthorize(...) 注释怎么办?我尝试以与上面相同的方式通过,但它不起作用:(。让我在下面清楚地写下我的问题(因为我无法在此处清楚地写出我的问题作为评论)
【解决方案2】:

抛出异常的原因是,属性占位符默认会在某个值无法解析时抛出异常。 此外,您有两个属性占位符,可能无法解析所有值。

您可以通过设置 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

【讨论】:

  • 为什么你认为这会改变什么? OP 声明该属性存在于其属性文件中。
  • Nils,我尝试了你的建议,但仍然是同样的例外。还是谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 1970-01-01
  • 2011-02-02
  • 2019-08-08
  • 2014-10-03
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多