gpt4 book ai didi

java - 将可变参数传递给 Spring spEL 会导致 "Method cannot be found on com.sun.proxy"

转载 作者:太空宇宙 更新时间:2023-11-04 11:00:31 24 4
gpt4 key购买 nike

我尝试编写自定义类来进行权限评估,因此它可以与 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

被抛出。当使用字符串数组调用时它仍然有效(基本上与可变参数相同,只是语法糖),如下所示:

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

我试图查看一些有关使用 spEL 传递可变参数的附加信息,但 Spring 文档只是神秘地 mentions在 spEL 文档中

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 spEL 会导致 "Method cannot be found on com.sun.proxy",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46953884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com