将varargs传递给Spring spEL导致“在com.sun.proxy上找不到方法”
我尝试编写用于权限评估的自定义类,因此它可以与Spring Security @PreAuthorize
和Spring Expression Language一起使用,例如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的其他信息,但Spring文档仅在spEL文档中提到了神秘的内容
Varargs也受到支持。
什么可能是这个exception的原因,除了在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]
- 单键按下连续移动?
- 了解Hibernate中的mappedBy注释
- NoClassDefFoundError:javax / validation /validation甚至在POM中validation-api 1.1.0.Final
- 而“!b.equals(x)|| !b.equals(y)“是一个无限循环?
- 如何通过Java中的Firefox配置文件下载CSV文件
- 如何阻止maven-shade-plugin阻止opensaml-impl类型的java.util.ServiceLoader初始化
- web.xml中的标记不会捕获java.lang.Throwableexception
- 学习Ant的最佳资源是什么?
- 使用Java以multithreading模式处理图像