我想将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>
请记住,我有'用户'和'客户'模型类。
我希望通过以下方式使用预授权注释和Spring表达式来保护名为'edit'的方法。
@PreAuthorize("(#user.userId == #customer.customerId)")
public Boolean edit(User user, Customer custmer) {
return true;
}
问题是,我如何将“example.xml文件中的userId和customerId的值传递给上面的表达式来比较这两个值,然后保护'edit'方法?
注意:我不想使用权限评估程序。如果可以在不考虑许可评估者的情况下进行,请指出我。非常感谢您的支持与合作!
答案 0 :(得分:1)
您可以使用@
参考beans references in SpEL expressions。
我稍微改变了你的例子,以使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
参数的userId
为33
时,才允许使用此方法(这是userBean
s userId
属性的值)
@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;
}
答案 1 :(得分: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)'
有什么建议吗?
UPDATE。将@ userBean.userId更改为@ user.userId,将@ customerBean.customerId更改为@ customer.customerId
答案 2 :(得分:0)
为什么将User和Customer声明为spring bean?