我在以下接口方法上应用@PreAuthorize:
@PreAuthoriz
@PreAuthorize("doSomething(#user.id)") void something(User user, List<User> accessList);
其中User是一个 hibernate实体 对象。它给我一个错误:
User
org.springframework.expression.spel.SpelEvaluationException:EL1007E:(pos 13):在org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:204)上找不到字段或属性’id’为null
user参数不可能为null,就好像我删除了注释,并在实现此接口方法的方法中检查user的值时,那里存在一个有效的User对象。另外,在调用此方法之前,我已确保正确构造了用户对象。
user
我真的不知道为什么userSPEL解析器会将字段视为空
您可以使用调试器检查 ObjectlookupVariable(String name) 方法内的 MethodSecurityEvaluationContext中 发生了什么: __
@Override public Object lookupVariable(String name) { Object variable = super.lookupVariable(name); if (variable != null) { return variable; } if (!argumentsAdded) { addArgumentsAsVariables(); argumentsAdded = true; }
因此,您可以看到 addArgumentsAsVariables() 方法中真正发生的事情,因为在Spring中非常清楚地实现了将方法参数转换为SPEL变量。