【问题标题】:NoSuchMethodError on Values.lazy (Jersey 2.5.1)Values.lazy 上的 NoSuchMethodError (Jersey 2.5.1)
【发布时间】:2014-02-13 00:05:07
【问题描述】:

我正式被这个拦截器弄糊涂了。

我已将 Jersey 从 2.4.1 升级到 2.5.1,因为 Jersey/Oracle 修复了一个影响 Swagger 工作的包扫描错误。经过大量黑客攻击以与我们基于 Spring 的服务器集成后,2.4.1 工作相对“还好”(spring-jersey3 是not working at all。)现在自从升级到 2.5.1(现在是 2.6-SNAPSHOT)后,我收到了每次我向与 API URL 模式匹配的任何内容发出请求时都会出现以下错误。

我做了什么:

  • 重新部署在新的、干净的服务器上(干净的 maven 存储库、干净的 tomcat 等);
  • 检查 jar 是否是正确的版本(甚至反编译了“Value”类以确保它是我在 GitHub 上看到的,它是大约 2 个月前更新的);
  • 查看所有使用tattletale 的jar 以查找类冲突;
  • 升级到 2.6-SNAPSHOT(如上所述),构建 latest
  • 发了bug(没有回复);

非常感谢帮助/解决方法/调试想法...除了废弃 Swagger、几天工作和回滚到 2.4.1 之外,我什至不知道我还能做什么

Feb 12, 2014 15:46:24 ERROR [TP-Processor6] [Catalina].[localhost].[/company
[Jersey REST Service] - Servlet.service() for servlet Jersey REST Service threw           
exception java.lang.NoSuchMethodError:
org.glassfish.jersey.internal.util.collection.Values.lazy(Lorg/glassfish/jersey/internal/util
collection/Value;)Lorg/glassfish/jersey/internal/util/collection/Value;
at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:346)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:372)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:335)
at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:218)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.company.videoapp.server.springframework.SessionFilter.doFilter(SessionFilter.java:44)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.company.videoapp.server.springframework.loader.ContextLoaderHttpInterceptor$LoaderState.filter(ContextLoaderHttpInterceptor.java:75)
at com.company.videoapp.server.springframework.loader.ContextLoaderHttpInterceptor$StartedState.filter(ContextLoaderHttpInterceptor.java:120)
at com.company.videoapp.server.springframework.loader.ContextLoaderHttpInterceptor.doFilter(ContextLoaderHttpInterceptor.java:62)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:311)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
at java.lang.Thread.run(Thread.java:662)

更新

我摆脱了普遍存在的 500 错误,但我仍然遇到该异常。以下是一些观察--

2.5.1 & 2.6-快照

接口...继承...在 2.5.1+ 中非常有问题(至少有两个回归错误。)

我经常出现 500 个错误是由于这个原因,所以在删除接口后,我可以至少找到一个有效的端点。以下场景:

破碎的场景 #1 -- 实现资源接口

@Path(MY_PATH)
@Produces(...)
@Consumes(...)
interface MyResource {
   ...
   @GET myResourceMethod();
}

.

public class MyAwesomeResource implements MyResource {
   ...
}

向上述资源发送请求会导致404 异常,这反过来又会导致客户端出现500,因为某些未知问题可能与上述异常有关。

破碎的场景 #2 -- 公开接口

@Path(MY_PATH)
@Produces(...)
@Consumes(...)
public interface MyResource {
   ...
   @GET myResourceMethod();
}

.

public class MyAwesomeResource implements MyResource {
   ...
}

在向资源发出请求时,由于内部 NoSuchMethodError 异常(注释中的异常——“在 MyResource.class 中找不到合适的构造函数”)导致另一个 500

原始问题中发布的异常掩盖了真正的异常(404 变为 500...我必须远程调试才能看到实际的异常。)

希望泽西岛的开发者关注这一点。不酷。

【问题讨论】:

  • 远程调试...这看起来像是 Jersey 的双重回归——继承的注解不起作用,而且接口注解不再起作用(Feb 12, 2014 17:21:59 ERROR [TP-Processor3] [Catalina].[localhost].[/company].[Jersey REST Service] - Servlet.service() for servlet Jersey REST Service threw exception java.lang.NoSuchMethodException: Could not find a suitable constructor in MyResourceInterface.class)——通过将接口从公开默认。不幸的是,Swagger 不支持注释继承,所以这些是相互矛盾的问题。

标签: api rest tomcat jersey jersey-2.0


【解决方案1】:

根据JERSEY-2394 中提供的信息,您的类路径包含这些库:

rw-rr- 1 root root 94774 Feb 10 12:02 cxf-rt-databinding-jaxb-2.3.2.jar
rw-rr- 1 root root 341446 Feb 10 12:02 cxf-rt-frontend-jaxws-2.3.2.jar
rw-rr- 1 root root 20020 Feb 10 12:02 jackson-jaxrs-base-2.2.3.jar
rw-rr- 1 root root 15243 Feb 10 12:02 jackson-jaxrs-json-provider-2.2.3.jar
rw-rr- 1 root root 25985 Feb 10 12:02 jackson-module-jaxb-annotations-2.2.3.jar
rw-rr- 1 root root 50034 Feb 10 12:02 jackson-module-jsonSchema-2.1.0.jar
rw-rr- 1 root root 79309 Feb 10 12:02 javax.json-1.0.2.jar
rw-rr- 1 root root 19754 Feb 10 12:02 javax.json-api-1.0.jar
rw-rr- 1 root root 876610 Feb 10 12:02 jaxb-impl-2.1.13.jar
rw-rr- 1 root root 226915 Feb 10 12:02 jaxen-1.1.1.jar
rw-rr- 1 root root 159742 Feb 10 14:02 jersey-client-2.5.1.jar
rw-rr- 1 root root 700399 Feb 10 14:02 jersey-common-2.5.1.jar
rw-rr- 1 root root 15684 Feb 10 14:02 jersey-container-servlet-2.5.1.jar
rw-rr- 1 root root 52593 Feb 10 12:02 jersey-container-servlet-core-2.1.jar
rw-rr- 1 root root 6412 Feb 10 14:02 jersey-media-json-processing-2.5.1.jar
rw-rr- 1 root root 63067 Feb 10 12:02 jersey-media-multipart-2.1.jar
rw-rr- 1 root root 828016 Feb 10 14:02 jersey-server-2.5.1.jar
rw-rr- 1 root root 86540 Feb 10 12:02 json4s-ast_2.10-3.2.4.jar
rw-rr- 1 root root 568890 Feb 10 12:02 json4s-core_2.10-3.2.4.jar
rw-rr- 1 root root 74565 Feb 10 12:02 json4s-ext_2.10-3.2.4.jar
rw-rr- 1 root root 39952 Feb 10 12:02 json4s-jackson_2.10-3.2.4.jar
rw-rr- 1 root root 68734 Feb 10 12:02 json4s-native_2.10-3.2.4.jar
rw-rr- 1 root root 7814 Feb 10 12:02 jsonp-jaxrs-1.0.jar
rw-rr- 1 root root 121047 Feb 10 12:02 swagger-jaxrs_2.10-1.3.2.jar
rw-rr- 1 root root 45719 Feb 10 12:02 swagger-jersey2-jaxrs_2.10-1.3.2.jar

您有 2 个与 2.5.1 版本不同的 Jersey jar - jersey-media-multipart-2.1.jarjersey-container-servlet-core-2.1.jar。后一个会导致您遇到的问题。堆栈跟踪中的行与使用 2.1 版本的 jersey servlet 核心而不是 2.5.1 的想法相对应(请参阅 2.1 中的 WebComponent)。解决方案是移除旧罐子。

【讨论】:

  • 哇,我很高兴你注意到了这一点,但很失望我没有。奇怪,因为 pom 中的所有内容都引用了 ${jersey.version},即 2.6-SNAPSHOT。将查看哪个依赖项将其引入 - 谢谢。
  • 修复——com.wordnikswagger-jersey2-jaxrs_2.10${swagger-jersey2.version }org.glassfish.jersey.mediajersey-media-multipart
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多