zhangchunhua opened SPR-13696 and commented

@RestController
public class UserController {

    @RequestMapping(path = "/user", method = RequestMethod.GET)
    @JsonView(User.WithoutPasswordView.class)
    public User getUser() {
        return new User("eric", "7!jd#h23");
    }
}
java.lang.IllegalArgumentException: interface org.springframework.core.annotation.SynthesizedAnnotation is not visible from class loader
at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:581)
at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:557)
at java.lang.reflect.WeakCache$Factory.get(WeakCache.java:230)
at java.lang.reflect.WeakCache.get(WeakCache.java:127)
at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:419)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:719)
at org.springframework.core.annotation.AnnotationUtils.synthesizeAnnotation(AnnotationUtils.java:1404)
at org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(AnnotatedElementUtils.java:405)
at org.springframework.web.method.HandlerMethod.getMethodAnnotation(HandlerMethod.java:234)
at org.springframework.web.method.HandlerMethod$HandlerMethodParameter.getMethodAnnotation(HandlerMethod.java:290)
at org.springframework.web.servlet.mvc.method.annotation.JsonViewResponseBodyAdvice.supports(JsonViewResponseBodyAdvice.java:50)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyAdviceChain.processBody(RequestResponseBodyAdviceChain.java:147)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyAdviceChain.beforeBodyWrite(RequestResponseBodyAdviceChain.java:138)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:217)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:153)
at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:165)
at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:80)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:412)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:282)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:201)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:175)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:561)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:565)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:545)
at java.lang.Thread.run(Thread.java:745)

Affects: 4.2.3

Reference URL: #18212

Issue Links: - #18212 IllegalArgumentException when using AnnotationUtils.findAnnotation - #18402 Regression: Spring 4.2.4 fails to load configuration class on Google App Engine

Referenced from: commits https://github.com/spring-projects/spring-framework/commit/d0814703c482711279d4bf4cce72b03da3128ac4

0 votes, 7 watchers

Comment From: spring-projects-issues

Stéphane Nicoll commented

Are you using Swagger by any chance? If so please try to remove it to see if the error goes away. We already got several reports with that same exception and Swagger was the root cause every single time.

Comment From: spring-projects-issues

zhangchunhua commented

I do not use Swagger by any chance .I just used JsonView as followed:


@RestController public class UserController { @RequestMapping(path = "/user", method = RequestMethod.GET) @JsonView(User.WithoutPasswordView.class) public User getUser()

}


In Spring4.2.2 ,this case is ok. But in Spring 4.2.3,when entering UserController ,IllegalArgumentException is throwed.

Comment From: spring-projects-issues

Stéphane Nicoll commented

Are you sure you don't have mixed versions of the framework? Can you run mvn dependencies:list on your project and check that all the Spring jars are using only 4.2.3.RELEASE? If that's the case, please share a project that reproduces the problem.

Comment From: spring-projects-issues

zhangchunhua commented

Thank you very much. I changed my web project into maven project. When I used mvn dependencies, spring4.2.3.RELEASE jars and other Dependent jars automatically were downloaded. In this case,the IllegalArgumentException is no longer throwed.This case came to be OK.

Comment From: spring-projects-issues

zhangchunhua commented

I am sorry.I am another problem. The same Project deployed in Tomcat,it is OK. But deployed in glassfish4.1,IllegalArgumentException is always throwed. I see that AnnotationUtils is modified form Proxy.newProxyInstance(ClassUtils.getDefaultClassLoader() to Proxy.newProxyInstance(annotation.getClass().getClassLoader(). Is it the reason?

My project Link:https://github.com/syw2452/git_syw.git

Comment From: spring-projects-issues

zhangchunhua commented

In glassfish4.1,this problem still exist

Comment From: spring-projects-issues

Stéphane Nicoll commented

This issue is related to a wrong usage of the framework and mixed jars as we already concluded. Your sample project does not use standard Spring libraries and the fact it works in tomcat is even more suspicious. As this is a usage problem, please ask on stackoverflow and the community will hopefully assist you.

Comment From: spring-projects-issues

D K commented

Not really sure why this is closed but I think there is a bug in the public api of AnnotatedElementUtils.

Related to the allusion of cause of the exception to swagger, I believe there is a breaking change (at runtime), that was introduced in 4.2 when the implementation of HandlerMethod.getMethodAnnotation changed from

// HandlerMethod.getMethodAnnotation implementation changed from:
    return AnnotationUtils.findAnnotation(this.method, annotationType);

//to:
    return AnnotatedElementUtils.findMergedAnnotation(this.method, annotationType);

Here is a simple test to prove it. When asking AnnotationElementUtils for an annotation that belongs the the java lang package (Deprecated) it fails with the reported exception.

public class AClass {
  @Deprecated
  public void aMethod() {

  }
}

public class ATest {
  @Test
  public void testAnnotation() throws NoSuchMethodException {
    AnnotatedElement method = AClass.class.getMethod("aMethod");
    AnnotatedElementUtils.findMergedAnnotation(method, Deprecated.class);
  }
}

Would you like me to create a new bug for this?

Comment From: spring-projects-issues

Juergen Hoeller commented

Let's reopen this one and repurpose it a bit: The hint with lookup of a JDK annotation is key here, since it'll be hard to synthesize those to begin with. In particular, we need to pay attention which class loader we're using for the synthesized type.

Juergen

Comment From: spring-projects-issues

Juergen Hoeller commented

We are explicitly checking whether the SynthesizedAnnotation marker is exposable to the annotation's own ClassLoader now. If not, we simply expose a plain annotation proxy without that marker type.

In order to nevertheless detect pre-synthesized annotations, we also check for the annotation proxy's InvocationHandler: If it's our internal one, we consider the annotation as pre-synthesized as well.

Juergen

Comment From: spring-projects-issues

Thibault Kruse commented

Same problem, using swagger via com.mangofactory:swagger-springmvc and switched from 4.2.2 to 4.2.3. Not mixing Spring library version (though using Spring security 4.0.3). Also see: https://github.com/springfox/springfox/issues/1055

Comment From: spring-projects-issues

Juergen Hoeller commented

Please give the latest 4.2.4.BUILD-SNAPSHOT a try and let me know whether it works for you there...

Juergen

Comment From: spring-projects-issues

Thibault Kruse commented

That's rather painful, as of now, 4.2.4.RELEASE-BUILD does not exist for e.g. spring-test or spring-context, spring-aop...

Comment From: spring-projects-issues

Stéphane Nicoll commented

What RELEASE-BUILD? As Juergen point out, the proper version is 4.2.4.BUILD-SNAPSHOT.

Comment From: spring-projects-issues

Thibault Kruse commented

Sorry, that's what I meant. 4.2.4.BUILD-SNAPSHOT is not defined for spring-test, spring-context, spring-aop. See here: https://repo.spring.io/snapshot/org/springframework/spring-context/4.2.4.BUILD-SNAPSHOT/

All poms are timestamped, and my maven thus does not seem to find 4.2.4.BUILD-SNAPSHOT. Maybe I did something else wrong...

Comment From: spring-projects-issues

Stéphane Nicoll commented

snapshot builds are always timestamped. I don't know what you're doing but it works for me. Maybe you need to add the spring snapshots repo in your pom?

<repositories>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>http://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
</repositories>

Comment From: spring-projects-issues

Thibault Kruse commented

ok, sorry for the confusion. 4.2.4.BUILD-SNAPSHOT seems to work for me.