복붙노트

[SPRING] varargs를 Spring spEL에 전달하면 "com.sun.proxy에서 메서드를 찾을 수 없습니다."

SPRING

varargs를 Spring spEL에 전달하면 "com.sun.proxy에서 메서드를 찾을 수 없습니다."

나는 권한 평가를위한 커스텀 클래스를 작성하려고 시도한다. 그래서 이것을 스프링 보안 @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

던져 질거야. 다음과 같이 String 배열 (기본적으로 구문 해석 설탕 인 varargs와 동일)을 사용하여 호출하면 여전히 작동합니다.

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

나는 varargs를 spEL과 함께 전달하는 것에 대한 추가적인 정보를 보려고했으나 Spring 문서는 단지 spEL 문서에서 enigmatically 언급한다.

이 예외의 원인은 무엇이며 spEL에서 배열을 전달하는 것보다 다른 해결 방법이 있습니까?

해결법

  1. ==============================

    1.어떤 버전의 Spring을 사용하고 있습니까? 방금 4.3.12로이 테스트 케이스를 실행했는데 제대로 작동했습니다 ...

    어떤 버전의 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]
    
  2. from https://stackoverflow.com/questions/46953884/passing-varargs-to-spring-spel-causes-method-cannot-be-found-on-com-sun-proxy by cc-by-sa and MIT license