1

我想将 xml 文件中分配的属性值传递给 Java 中的 Spring 表达式(SpEL)。你能指出我如何实现这一目标吗?为了清楚起见,我提供了以下示例。

example.xml 文件:

<beans>
    <bean id="user" class="x.y.User">
        <property name="name" value="A"/>
        <property name="userId" value="33"/>

    <bean id="customer" class="x.y.Customer">
        <property name="name" value="B"/>
        <property name="customerId" value="33"/>      
    </bean>   
</beans>

请记住,我有“用户”和“客户”模型类。

我想通过以下方式使用 Pre-Authorize 注释和 Spring 表达式来保护称为“编辑”的方法。

@PreAuthorize("(#user.userId == #customer.customerId)")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

问题是,如何将 userId 和 customerId 的值从“example.xml”文件传递到上述表达式以比较这两个值,然后保护“编辑”方法?

注意:我不想使用权限评估器。请指出我是否可以在不考虑权限评估者的情况下做到这一点。您的支持与合作将不胜感激!

4

3 回答 3

1

@Rob,它不起作用。如果 userBean 的 userId 和 customerBean 的 customerId 相等,则允许使用“edit”方法。根据您的建议,应按以下方式编写:

@PreAuthorize("@userBean.userId == @customerBean.customerId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}   

但它返回以下错误:

java.lang.IllegalArgumentException: Failed to evaluate expression '(@userBean.userId == @customerBean.customerId)'

请问有什么建议吗?

更新。将@userBean.userId 更改为@user.userId,将@customerBean.customerId 更改为@customer.customerId

于 2013-11-04T10:16:13.533 回答
1

您可以在 SpEL 表达式中使用@.

我对您的示例进行了一些更改,以使 SpEL 表达式的哪一部分引用 bean 以及哪一部分引用方法参数更加明显。给定以下配置:

<beans>
    <bean id="userBean" class="x.y.User">
        <property name="name" value="A"/>
        <property name="userId" value="33"/>

    <bean id="customerBean" class="x.y.Customer">
        <property name="name" value="B"/>
        <property name="customerId" value="33"/>      
    </bean>   
</beans>

User仅当参数具有userIdof 33(这是userBeansuserId属性的值)时才允许使用此方法。

@PreAuthorize("#user.userId == @userBean.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

同样,您可以使用以下内容引用具有 id 的客户customerBean(如我的示例 XML 中所定义):

@PreAuthorize("#custmer.userId == @customerBean.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}

如果您希望它对您当前的 XML 配置做同样的事情,您可以使用以下内容。这里的重点是,后面的值@应该与 bean 的名称匹配。

@PreAuthorize("#user.userId == @user.userId")    
public Boolean edit(User user, Customer custmer)  {              
    return true; 
}
于 2013-10-30T17:30:17.660 回答
0

为什么将 User 和 Customer 声明为 spring bean?

于 2013-11-01T09:16:53.613 回答