项目在开发、测试环境上没问题,上生产环境报错如下
java.lang.NoSuchMethodError: javax.ws.rs.ClientErrorException.validate(Ljavax/ws/rs/core/Response;Ljavax/ws/rs/core/Response$Status$Family;)Ljavax/ws/rs/core/Response;
Exception
javax.servlet.ServletException: Servlet execution threw an exception
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
com.xx.sign.xx.CorsFilter.doFilter(CorsFilter.java:24)
Root Cause
java.lang.NoSuchMethodError: javax.ws.rs.ClientErrorException.validate(Ljavax/ws/rs/core/Response;Ljavax/ws/rs/core/Response$Status$Family;)Ljavax/ws/rs/core/Response;
javax.ws.rs.ClientErrorException.<init>(ClientErrorException.java:88)
org.apache.cxf.jaxrs.utils.JAXRSUtils.findTargetMethod(JAXRSUtils.java:503)
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:198)
org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:90)
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:272)
org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:248)
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:222)
org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:153)
org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:167)
org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:286)
org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:211)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:262)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
com.xx.xx.utils.CorsFilter.doFilter(CorsFilter.java:24)
开始以为是环境问题,但是查看后操作系统、jdk、tomcat版本都是一毛一样。
看到这个org.apache.tomcat.websocket.server.WsFilter.doFilter,难道是tomcat lib下面有包冲突了覆盖了,发现也不是。
那就问题就应该出在项目内部的jar有版本冲突,只是在不知道什么原因在生产环境类的加载顺序跟开发环境不一致。
在idea中找这个类ClientErrorException,发现这在这个jar中
发现没有validate方法
但是代码中看到很多地方调用validate方法
那就应该在父类中,进入父类WebapplicationException,看到父类有validate方法
那怎么会报错找不到方法呢?
再查找一下这个类WebApplicationException,喔嚯!找到两个,在不同的jar包,但是类路径一毛一样。
看jsr311-api-1.0.jar的类,没有validate方法
于是将该类移除,重启服务一看,正常了!
当然要在确定该jar无用的情况可直接移除,否则需要找高版本的替换。
最后吐槽一下:这个项目前人多年前写的,跟三方服务对接的项目,十多个接口,接口用servlet,里面既然有九十多个jar。
里面集齐了主流json解析、xml解析框架、spring一套,打个war包有60M+,几个其他项目一直在用这个,又不敢动。