You need to enable JavaScript to run this app. Jersey从2.27升级至2.32+版本时请求触发NoSuchMethodError崩溃求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.08 01:27:04