当前位置: 首页 > 知识库问答 >
问题:

通过注释注入属性

苗森
2023-03-14

我是Spring Security的新手。我看过很多关于如何通过外部属性文件的注释注入值的文章。我尝试了很多方法,但最终都是用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=nnemp.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("(#{valProp['val.id']} == #{valProp['emp.id']})")
public boolean update(){
  //if accessable
  return true;
}

但是表达式{valProp['val.id']}=={valProp['emp.id']}没有计算。

我在注入值时是否犯了错误?当我注释成员变量时,它是有效的,但在这里不起作用。有什么想法吗?提前谢谢。

共有2个答案

韩单弓
2023-03-14

引发异常的原因是,默认情况下,当无法解析值时,属性占位符会引发异常。此外,您有两个属性占位符,通过它可能无法解析所有值。

您可以通过设置ignore Unsolvable属性来更改此行为:

<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

秋光熙
2023-03-14

试着考虑以下几点

1). 将注释更改为:

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

2). 用PropertiesFactoryBean替换PropertyPlaceHolderConfigure

希望这能解决这个例外。

 类似资料:
  • 我在整个代码中有一堆常量,用于系统的各种可调整属性。我正在将它们全部移动到一个中央文件中。我目前的解决方案是有一个静态加载文件并公开各种getter方法,如下所示: 唯一的问题是,对于我从这个文件中获得的每个常量,我都有一些样板: 我不认为我想使用Spring或类似的东西,因为那看起来更像是boilerplae。我希望使用自定义注释来解决这个问题。我找到了这个教程,但是我真的不能弄清楚如何从注释处

  • 我有以下课程: 我从控制器调用方法test(): 然而,spring并没有注入构建。版本值,即使类具有组件注释。 我在控制器中使用相同的属性,它工作正常。 我做错了什么?

  • 我试图向自定义注释中注入一个值,但Spring似乎没有进行评估。

  • 如何使用注释填充值映射,而不在applicationContext中定义任何内容。xml或任何其他xml文件。 我使用的是SpringBoot,它没有任何XML文件,也不需要任何XML文件,所以请不要告诉我用XML等声明任何属性读取器bean。 此外,这是一个属性注入问题-请不要建议使用数据库存储数据-这不是一个答案,对于我的情况也不可能。 此外,我也不能使用YAML(由于部署/操作需求)。 我已

  • 问题内容: 有什么方法可以通过JPA注释指定SQL注释?表和列的注释。 问题答案: 有什么方法可以通过JPA注释指定SQL注释?表和列的注释。 否。如果要定义表和列注释,最好的选择是在生成的DDL中根据事实进行操作,然后再对数据库执行操作。

  • 问题内容: 我试图通过注释将整个JSF托管Bean注入另一个托管Bean非常相似,但是我正在注入Bean,而不是Servlet)。这就是我在做什么: 不起作用(JSF 2.0 / Mojarra 2.0.3): 有没有可能或者我需要通过编程方式进行注射? 问题答案: 您需要添加setter和getter 当将解析并注入依赖项时,它将使用setters注入,因此适当的setters / getter