- Notifications
You must be signed in to change notification settings - Fork 38.8k
Closed
Labels
in: webIssues in web modules (web, webmvc, webflux, websocket)Issues in web modules (web, webmvc, webflux, websocket)type: documentationA documentation taskA documentation task
Milestone
Description
Base info:
- JAVA version: 17
- Spring boot version: 3.2.6
Reproduce steps:
- copy this code from rest-http-interface
interface RepositoryService { @GetExchange("/repos/{owner}/{repo}") Repository getRepository(@PathVariable String owner, @PathVariable String repo); // more HTTP exchange methods... }
- run the project got error:
2025-02-18T16:08:00.290+08:00 ERROR 41328 --- [nio-8088-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalArgumentException: non-public interface is not defined by the given loader] with root cause java.lang.IllegalArgumentException: non-public interface is not defined by the given loader at java.base/java.lang.reflect.Proxy$ProxyBuilder.mapToModule(Proxy.java:818) ~[na:na] at java.base/java.lang.reflect.Proxy$ProxyBuilder.<init>(Proxy.java:651) ~[na:na] at java.base/java.lang.reflect.Proxy.lambda$getProxyConstructor$1(Proxy.java:440) ~[na:na] at java.base/jdk.internal.loader.AbstractClassLoaderValue$Memoizer.get(AbstractClassLoaderValue.java:329) ~[na:na] at java.base/jdk.internal.loader.AbstractClassLoaderValue.computeIfAbsent(AbstractClassLoaderValue.java:205) ~[na:na] at java.base/java.lang.reflect.Proxy.getProxyConstructor(Proxy.java:438) ~[na:na] at java.base/java.lang.reflect.Proxy.newProxyInstance(Proxy.java:1037) ~[na:na] at org.springframework.aop.framework.JdkDynamicAopProxy.getProxy(JdkDynamicAopProxy.java:124) ~[spring-aop-6.1.8.jar:6.1.8] at org.springframework.aop.framework.JdkDynamicAopProxy.getProxy(JdkDynamicAopProxy.java:116) ~[spring-aop-6.1.8.jar:6.1.8] at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:97) ~[spring-aop-6.1.8.jar:6.1.8] at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:137) ~[spring-aop-6.1.8.jar:6.1.8] at org.springframework.web.service.invoker.HttpServiceProxyFactory.createClient(HttpServiceProxyFactory.java:91) ~[spring-web-6.1.8.jar:6.1.8] at com.igwfmc.DemoController.proxy(DemoController.java:32) ~[main/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.1.8.jar:6.1.8] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.1.8.jar:6.1.8] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.8.jar:6.1.8]
Solution
Adding 'public' before an interface class
public interface RepositoryService { @GetExchange("/repos/{owner}/{repo}") Repository getRepository(@PathVariable String owner, @PathVariable String repo); // more HTTP exchange methods... }
Metadata
Metadata
Assignees
Labels
in: webIssues in web modules (web, webmvc, webflux, websocket)Issues in web modules (web, webmvc, webflux, websocket)type: documentationA documentation taskA documentation task