编程语言
首页 > 编程语言> > java-将varargs传递给Spring spEL会导致“在com.sun.proxy上找不到方法”

java-将varargs传递给Spring spEL会导致“在com.sun.proxy上找不到方法”

作者:互联网

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

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

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

boolean anyOfRoles(String... roles)

如图所示,此方法采用String类型的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

被抛出.当使用Strings数组(基本上与varargs相同,只是语法糖)一起调用时,它仍然有效,如下所示:

@PreAuthorize("@permissionEvaluator.anyOfRoles(new String[] { @authority.ADMIN, @authority.USER })")

我试图查看有关通过spEL传递varargs的其他信息,但Spring文档在spEL文档中只能使人迷惑地mentions,

Varargs are also supported.

造成此异常的原因可能是什么,除了在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]

标签:java,spring,spring-security,spring-el
来源: https://codeday.me/bug/20191013/1906185.html