Jersey从2.27升级至2.32+版本时请求触发NoSuchMethodError崩溃求助
Jersey 跨版本升级触发
NoSuchMethodError问题排查与解决 问题现象
- 项目完成Jersey依赖升级工作,将版本从2.27迭代至2.32后,任意REST请求发起时均会触发固定运行时错误
- 版本测试结论:依次验证2.28、2.30、2.31版本均会触发完全一致的报错,仅2.27及更早版本可正常运行
- 完整报错堆栈:
java.lang.NoSuchMethodError: org.glassfish.jersey.internal.LocalizationMessages.WARNING_PROPERTIES()Ljava/lang/String; at org.glassfish.jersey.internal.config.SystemPropertiesConfigurationModel.getProperties(SystemPropertiesConfigurationModel.java:122) at org.glassfish.jersey.internal.config.SystemPropertiesConfigurationProvider.getProperties(SystemPropertiesConfigurationProvider.java:29) at org.glassfish.jersey.internal.config.ExternalPropertiesConfigurationFactory.readExternalPropertiesMap(ExternalPropertiesConfigurationFactory.java:55) at org.glassfish.jersey.internal.config.ExternalPropertiesConfigurationFactory.configure(ExternalPropertiesConfigurationFactory.java:72) at org.glassfish.jersey.internal.config.ExternalPropertiesConfigurationFeature.configure(ExternalPropertiesConfigurationFeature.java:26) at org.glassfish.jersey.model.internal.CommonConfig.configureFeatures(CommonConfig.java:730) at org.glassfish.jersey.model.internal.CommonConfig.configureMetaProviders(CommonConfig.java.java:648) at org.glassfish.jersey.client.ClientConfig$State.configureMetaProviders(ClientConfig.java:372) at org.glassfish.jersey.client.ClientConfig$State.initRuntime(ClientConfig.java:405) at org.glassfish.jersey.client.ClientConfig$State.access$000(ClientConfig.java:90) at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:122) at org.glassfish.jersey.client.ClientConfig$State$3.get(ClientConfig.java:119) at org.glassfish.jersey.internal.util.collection.Values$LazyValueImpl.get(Values.java:340) at org.glassfish.jersey.client.ClientConfig.getRuntime(ClientConfig.java.java:733) at org.glassfish.jersey.client.ClientRequest.getConfiguration(ClientConfig.java:286) at org.glassfish.jersey.client.JerseyInvocation.validateHttpMethodAndEntity(JerseyInvocation.java:135) at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:105) at org.glassfish.jersey.client.JerseyInvocation.<init>(JerseyInvocation.java:92) at org.glassfish.jersey.client.JerseyInvocation$Builder.build(JerseyInvocation.java:204) at oracle.bi.majel.platform.svs.client.GatewayClient.RestGatewayRequestClient.invoke(RestGatewayRequestClient.java:24) at oracle.bi.majel.platform.svs.security.MajelSecurityContext.getBipsCookie(MajelSecurityContext.java:278) at oracle.bi.majel.platform.svs.security.MajelSecurityContext.setContextCredentials(MajelSecurityContext.java:224) at oracle.bi.majel.web.jaxrs.resource.v2.PlatformResource.getResponse(PlatformResource.java:633) at oracle.bi.majel.web.jaxrs.resource.v2.PlatformResource.getProfile(PlatformResource.java:530) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory$1.invoke(ResourceMethodInvocationHandlerFactory.java:81) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:144) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:161) at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160) at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99) at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347) at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102) at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271) at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267) at org.glassfish.jersey.internal.Errors.process(Errors.java:315) at org.glassfish.jersey.internal.Errors.process(Errors.java:297) at org.glassfish.jersey.internal.Errors.process(Errors.java:267) at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317) at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:305) at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1154) at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:473) at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:427) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:388) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:341) at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:228) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:295) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:260) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:137) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:353) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at oracle.bi.security.filter.BISecurityRESTFilter.lambda$chainToNext$1(BISecurityRESTFilter.java:608) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAsPrivileged(Subject.java:549) at oracle.bi.security.filter.BISecurityRESTFilter.chainToNext(BISecurityRESTFilter.java:614) at oracle.bi.security.filter.BISecurityRESTFilter.handleContainerSubject(BISecurityRESTFilter.java:387) at oracle.bi.security.filter.BISecurityRESTFilter.doFilter(BISecurityRESTFilter.java:143) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at oracle.wsm.agent.handler.servlet.SecurityFilter$3.run(SecurityFilter.java:514) at java.security.AccessController.doPrivileged(Native Method) at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:314) at oracle.security.jps.internal.jaas.AccActionExecutor.execute(AccActionExecutor.java:70) at oracle.security.jps.internal.jaas.AbstractSubjectSecurity$ActionExecutorWrapper.execute(AbstractSubjectSecurity.java:282) at oracle.security.jps.internal.jaas.CascadeActionExecutor$SubjectPrivilegedExceptionAction.run(CascadeActionExecutor.java:82) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:386) at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:163) at weblogic.security.Security.runAs(Security.java:62) at oracle.security.jps.wls.jaas.WlsActionExecutor.execute(WlsActionExecutor.java:50) at oracle.security.jps.internal.jaas.CascadeActionExecutor.execute(CascadeActionExecutor.java:55) at oracle.security.jps.internal.jaas.AbstractSubjectSecurity$ActionExecutorWrapper.execute(AbstractSubjectSecurity.java:282) at oracle.security.jps.internal.jaas.AbstractSubjectSecurity.executeAs(AbstractSubjectSecurity.java:236) at oracle.wsm.agent.handler.servlet.SecurityFilter.processRequest(SecurityFilter.java:509) at oracle.wsm.agent.handler.servlet.SecurityFilter.doFilter(SecurityFilter.java:311) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at oracle.security.jps.ee.http.JpsAbsFilter$3.run(JpsAbsFilter.java:175) at java.security.AccessController.doPrivileged(Native Method) at oracle.security.jps.util.JpsSubject.doAsPrivileged(JpsSubject.java:314) at oracle.security.jps.ee.util.JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:650) at oracle.security.jps.ee.http.JpsAbsFilter.runJaasMode(JpsAbsFilter.java:112) at oracle.security.jps.ee.http.JpsAbsFilter.doFilterInternal(JpsAbsFilter.java:293) at oracle.security.jps.ee.http.JpsAbsFilter.doFilter(JpsAbsFilter.java:150) at oracle.security.jps.ee.http.JpsFilter.doFilter(JpsFilter.java:94) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at oracle.dms.servlet.DMSServletFilter.doFilter(DMSServletFilter.java:248) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at oracle.jrf.servlet.ExtensibleGlobalFilter.doFilter(ExtensibleGlobalFilter.java:92) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:32) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:78) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3797) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3763) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:344) at weblogic.security.service.SecurityManager.runAsForUserCode(SecurityManager.java:197) at weblogic.servlet.provider.WlsSecurityProvider.runAsForUserCode(WlsSecurityProvider.java:203) at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:71) at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2451) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2299) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2277) at weblogic.servlet.internal.ServletRequestImpl.runInternal(ServletRequestImpl.java:1710) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1670) at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:272) at weblogic.invocation.ComponentInvocationContextManager._runAs(ComponentInvocationContextManager.java:352) at weblogic.invocation.ComponentInvocationContextManager.runAs(ComponentInvocationContextManager.java:337) at weblogic.work.LivePartitionUtility.doRunWorkUnderContext(LivePartitionUtility.java:57) at weblogic.work.PartitionUtility.runWorkUnderContext(PartitionUtility.java:41) at weblogic.work.SelfTuningWorkManagerImpl.runWorkUnderContext(SelfTuningWorkManager.java:655) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:420) at weblogic.work.ExecuteThread.run(ExecuteThread.java:360)
- 初步排查的反常点:报错堆栈指向的
SystemPropertiesConfigurationModel.getProperties()方法所调用的LocalizationMessages.WARNING_PROPERTIES()方法真实存在,且两个类同属项目打包的目标版本jersey-common依赖库,不存在方法缺失问题。 - 当前build.gradle中的相关依赖配置片段:
jerseyMediaDeps(group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: jerseyVersion) { exclude(group: "com.fasterxml.jackson.jaxrs") exclude(group: "com.fasterxml.jackson.core") } jerseyMediaDeps(group: 'org.glassfish.jersey.media', name: 'jersey-media-json-processing', version: jerseyVersion) jerseyMediaDeps(group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart', version: jerseyVersion) jerseyDeps(group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet', version: jerseyVersion) jerseyDeps(group: 'org.glassfish.jersey.containers', name: 'jersey-container-servlet-core', version: jerseyVersion) jerseyDeps(group: 'org.glassfish.jersey.core', name: 'jersey-server', version: jerseyVersion) jerseyDeps(group: 'org.glassfish.jersey.core', name: 'jersey-client', version: jerseyVersion) jerseyDeps(group: 'org.glassfish.jersey.core', name: 'jersey-common', version: jerseyVersion) platformDeps(group: 'org.glassfish.jersey.connectors', name: 'jersey-apache-connector', version: jerseyVersion) platformDeps(group: 'com.sun.xml.bind', name: 'jaxb-core', version: jaxbVersion) platformDeps(group: 'com.sun.xml.bind', name: 'jaxb-impl', version: jaxbVersion) coreDeps(group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: jacksonVersion) coreDeps(group: 'com.fasterxml.jackson.module', name: 'jackson-module-kotlin', version: jacksonVersion) coreDeps(group: 'com.fasterxml.jackson.module', name: 'jackson-module-jaxb-annotations', version: jacksonVersion) coreDeps(group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-base', version: jacksonVersion) coreDeps(group: 'com.fasterxml.jackson.jaxrs', name: 'jackson-jaxrs-json-provider', version: jacksonVersion) coreDeps(group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: jacksonVersion)
问题根因
本质为跨版本类加载冲突,并非依赖包本身的方法缺失:
- 应用部署于WebLogic容器,容器默认启用容器类优先加载机制,WebLogic内置了2.27及更早版本的
jersey-common依赖,运行时会优先加载容器内的旧版Jersey类 - 项目内升级到2.32版本的Jersey组件(如
SystemPropertiesConfigurationModel)会尝试调用旧版LocalizationMessages类中不存在的WARNING_PROPERTIES()方法,最终抛出NoSuchMethodError - 这种错配会形成“项目依赖内方法存在,但运行时实际加载的是旧版本类,导致方法找不到”的反常现象
解决步骤
- 第一步:全量排查依赖树版本错配
执行gradle dependencies --configuration runtimeClasspath命令,扫描所有引入的Jersey相关依赖,确保jersey-common、jersey-server、jersey-client、Jersey media组件、Jersey connector组件的版本完全对齐到目标升级版本,排除所有传递引入的旧版本Jersey依赖 - 第二步:调整WebLogic类加载优先级
在应用的WEB-INF/weblogic.xml配置中,设置应用类优先加载规则,将org.glassfish.jersey.全量包加入优先加载列表,避免容器内置的旧版Jersey类被优先加载 - 第三步:验证实际类加载路径
应用启动时添加JVM参数-verbose:class,跟踪LocalizationMessages类的实际加载来源,确认加载的jar包为应用自身打包的目标版本,而非容器内置的旧版本
内容的提问来源于stack exchange,提问作者Fransebas
相关产品推荐
相关产品推荐

