我尝试为权限评估编写自定义类,因此它可以与Spring Security @PreAuthorize
和Spring表达式语言一起使用,例如this(authority
只是一个带有一些角色名称的常规Spring组件):
@PreAuthorize("@permissionEvaluator.anyOfRoles(@authority.ADMIN)")
PermissionEvaluator#anyOfRoles
方法声明如下所示:
boolean anyOfRoles(String... roles)
如图所示,此方法采用String类型的变量。只传递一个参数(如上例所示),但是使用多个参数调用它时,它工作正常,例如。
@PreAuthorize("@permissionEvaluator.anyOfRoles(@authority.ADMIN, @authority.USER)")
原因
org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method anyOfRoles(java.lang.String,java.lang.String) cannot be found on com.sun.proxy.$Proxy132 type
被抛出。它在使用字符串数组调用时仍然有效(基本上与varargs相同,这只是语法糖),如下所示:
@PreAuthorize("@permissionEvaluator.anyOfRoles(new String[] { @authority.ADMIN, @authority.USER })")
我试图查看一些关于使用spEL传递varargs的其他信息,但是在spEL文档中仅使用Spring文档mentions
也支持Varargs。
这个异常可能是什么原因,除了在spEL中传递数组还有其他解决方法吗?
答案 0 :(得分:0)
您使用的是哪个版本的Spring?我刚用4.3.12运行了这个测试用例,它工作得很好......
@SpringBootApplication
public class So46953884Application {
public static void main(String[] args) {
SpringApplication.run(So46953884Application.class, args);
}
@Value("#{foo.foo('a', 'b')}")
private String foo;
@Bean
public ApplicationRunner runner() {
return args -> System.out.println(foo);
}
@Bean
public Foo foo() {
return new Foo();
}
public static class Foo {
public String foo(String... strings) {
return "filled: " + Arrays.toString(strings);
}
}
}
结果:
filled: [a, b]