【问题标题】:NoSuchMethodError with CXF Response ObjectNoSuchMethodError 与 CXF 响应对象
【发布时间】:2014-05-14 13:48:06
【问题描述】:

这是我在 Websphere 上运行代码时遇到的错误。

NoSuchMethodError: javax/ws/rs/core/Response.readEntity(Ljava/lang/Class;)Ljava/lang/Object;

在 Tomcat 上运行时没有出现同样的错误

代码是(抛出异常的最后一行)

  WebClient client = WebClient.create("http://x.x.x.:8080/webp/services/RS/webp/pt/" );
  client.accept(APPLICATION_XML);
  Response r = client.post(request);
  WebPTResponse resp = r.readEntity(WebPTResponse.class);

现在,呼叫是从一个 Web 服务器到另一个。 如果我用我的 Tomcat 调用目标,它可以工作,如果我从 Websphere 调用它,则会出错。

Response 对象的实例是一个

wsjar:file:/opt/was/profiles/WTUKCWASESI01_NODE01/installedApps/BS_Cell/ESIPTService.ear/ESIPTService.war/WEB-INF/lib/cxf-rt-frontend-jaxrs-2.7.7.jar!/org/apache/cxf/jaxrs/impl/ResponseImpl.class

Websphere 中的类加载设置为 Parent Last。

我不知道下一步该尝试什么。

如果我调试并尝试进入对 readEntity 的调用,它会在此时出错。

任何人都可以提出一个原因或其他我可以测试的东西吗?

全栈。

java.lang.NoSuchMethodError: javax/ws/rs/core/Response.readEntity(Ljava/lang/Class;)Ljava/lang/Object; 在 com.ptservice.impl.internal.PtServiceInternalImpl.sendRequest(PtServiceInternalImpl.java:191) 在 com.ptservice.impl.internal.PtServiceInternalImpl.processPt(PtServiceInternalImpl.java:126) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 在 java.lang.reflect.Method.invoke(Method.java:611)


远程调试显示...

r.getClass().getDeclaredMethods()[31]

(java.lang.reflect.Method) 公共 java.lang.Object org.apache.cxf.jaxrs.impl.ResponseImpl.readEntity(java.lang.Class) 投掷 javax.ws.rs.MessageProcessingException,java.lang.IllegalStateException

【问题讨论】:

标签: java jaxb websphere tomcat7 cxf


【解决方案1】:

最后我把这段代码放到了适当的位置。

它不好,我不喜欢它,但它有效。

  if (r instanceof org.apache.cxf.jaxrs.impl.ResponseImpl)
  {
    webResource = ((org.apache.cxf.jaxrs.impl.ResponseImpl)r).readEntity(WebPEDResponse.class);
  } else
  {
    webResource = r.readEntity(WebPEDResponse.class);
  }

如果您真的想要一些带/大括号的方法,您可以添加一个额外的捕获并使用反射来获得值。

    private WebPEDResponse getResponseHandleIBMJDKIssue(Response r)
      {
        WebPEDResponse webResource = null;
        try {
          if (r instanceof org.apache.cxf.jaxrs.impl.ResponseImpl)
          {
            webResource = ((org.apache.cxf.jaxrs.impl.ResponseImpl)r).readEntity(WebPEDResponse.class);
          } else
          {
            webResource = r.readEntity(WebPEDResponse.class);
          }
} catch (Throwable e)
{
  LOG.trace("IBM JDK ISSUE: will try to call 'readEntity' via reflection", e);
}

if (webResource == null)
{
  try 
  {
    if (r.getClass().getDeclaredMethods()[31].getName().equals("readEntity"))
    {
      webResource = (WebPEDResponse) r.getClass().getDeclaredMethods()[31].invoke(r, WebPEDResponse.class);
    }

    if (webResource == null)
    {
      Method[] declaredMethods = r.getClass().getDeclaredMethods();
      for (Method method : declaredMethods)
      {
        if (method.getName().equals("readEntity"))
        {
          webResource = (WebPEDResponse) method.invoke(r, WebPEDResponse.class);
        }
      }
    }
  }
  catch (Throwable e)
  {
    LOG.error("IBM JDK ISSUE: tried to call 'readEntity' via reflection, didnt work.", e);
  }
}
return webResource;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多