【发布时间】: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