【问题标题】:Passing varargs to Spring spEL causes "Method cannot be found on com.sun.proxy"将可变参数传递给 Spring spEL 导致“在 com.sun.proxy 上找不到方法”
【发布时间】:2017-10-26 20:41:17
【问题描述】:

我尝试为权限评估编写自定义类,因此它可以与 Spring Security @PreAuthorize 和 Spring 表达式语言一起使用,例如(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 文档中神秘地 mentions

还支持可变参数。

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

【问题讨论】:

    标签: java spring spring-security spring-el


    【解决方案1】:

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

    【讨论】:

    • 我正在运行 Spring 4.3.12(因为它是我正在使用的 Spring Boot 1.5.8 附带的版本)。只是为了确保检索变量值不存在问题(我从另一个组件中获取它们),我尝试在 spEL 中将这些字符串作为文字传递,但得到了相同的异常。
    • 有趣;我可以用安全的东西重现……正在调查……
    • 当有问题的bean是代理时会出现问题;我打开了这个SPR-16122JIRA 问题。
    • 好的。感谢您对此进行调查并采取行动,我现在将坚持使用数组作为我的可变参数,并关注要更新的问题。
    • Juergen 已经修复了 JIRA,它将在下一个版本中发布(我猜是启动 1.5.9)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2020-02-01
    • 1970-01-01
    • 2016-05-08
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多