将 varargs 传递给 Spring spEL 会导致"Method cannot be found on com.sun.proxy"



我尝试编写用于权限评估的自定义类,因此它可以与Spring Security@PreAuthorize和Spring Expression Language一起使用,例如(authority只是一个具有一些角色名称的常规Spring组件):

@PreAuthorize("@permissionEvaluator.anyOfRoles(@authority.ADMIN)")

PermissionEvaluator#anyOfRoles方法声明如下所示:

boolean anyOfRoles(String... roles)

如图所示,此方法采用字符串类型的varargs。当只传递一个参数(如上面的例子),但用多个参数调用它时,它工作得很好,例如

@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的额外信息,但Spring文档在spEL文档中只神秘地提到

Varargs也受支持。

此异常的原因可能是什么?除了在spEL中传递数组之外,还有其他解决方法吗?

您使用的是什么版本的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]

相关内容

最新更新