gpt4 book ai didi

java - 无法反序列化 HTTP 调用程序远程服务的结果 [...];嵌套异常是 java.lang.ClassNotFoundException :

转载 作者:行者123 更新时间:2023-12-02 09:07:54 27 4
gpt4 key购买 nike

仅当共享库添加到 IBM WebSphere 实例(版本 8.5.xx)上的应用程序时,我才会收到以下错误。目标是将某些应用程序之间的大量共享库(jar)移动到服务器上的共享库,以减少应用程序的 war 规模。但从我所看到的来看, war 文件大小是否减小并不重要,每当添加此共享库时,我们都会看到以下错误。

org.springframework.remoting.RemoteAccessException: Could not deserialize result from HTTP invoker remote service [<URL>]; nested exception is java.lang.ClassNotFoundException: com.example.models.ExampleModel
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.convertHttpInvokerAccessException(HttpInvokerClientInterceptor.java:221)
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:153)
at com.example.configuration.LoggingHttpInvokerProxyFactoryBean.invoke(LoggingHttpInvokerProxyFactoryBean.java:28)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy305.getSomeListOfObjects(Unknown Source)
...
...
...
Caused by: java.lang.ClassNotFoundException: com.example.models.ExampleModel
at java.lang.Class.forNameImpl(Native Method)
at java.lang.Class.forName(Class.java:403)
at java.io.ClassCache$FutureValue.get(ClassCache.java:177)
at java.io.ClassCache.get(ClassCache.java:148)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:834)
at org.springframework.core.ConfigurableObjectInputStream.resolveClass(ConfigurableObjectInputStream.java:78)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:2017)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1900)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2194)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1722)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2439)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2363)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2221)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1722)
at java.io.ObjectInputStream.readObjectImpl(ObjectInputStream.java:540)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:475)
at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.doReadRemoteInvocationResult(AbstractHttpInvokerRequestExecutor.java:291)
at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.readRemoteInvocationResult(AbstractHttpInvokerRequestExecutor.java:242)
at org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor.doExecuteRequest(HttpComponentsHttpInvokerRequestExecutor.java:248)
at org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.executeRequest(AbstractHttpInvokerRequestExecutor.java:137)
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:202)
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.executeRequest(HttpInvokerClientInterceptor.java:184)
at org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.invoke(HttpInvokerClientInterceptor.java:150)

以下是模型类在较小规模下的类似示例。我主要想指出的是,它确实实现了可序列化(使用默认的serialVersionUID):

package com.example.models.ExampleModel;

public class ExampleModel implements Serializable {
private static final long serialVersionUID = 1L;
private String customerNumber = "";
}

任何调试想法至少都会受到极大的赞赏。我还想指出,当共享库未添加到服务器上的应用程序时,调用此远程处理方法可以正常工作,但在添加共享库时似乎不起作用。另外,服务器上的共享库没有包含无法找到的类的jar。包含无法找到的类的 jar 位于我的 WEB-INF/lib 文件夹中,并且我已验证将其安装在服务器上。

最佳答案

这看起来像是类加载器层次结构的问题,其中由应用程序 (EAR) 类加载器加载的类尝试加载打包在 Web 模块 (WAR) 加载器中的类。我相信 ObjectInputStream 的resolveClass() 方法正在使用其调用者的类加载器来加载失败的类,并且我还假设您的 Spring 类位于共享库中。

在 Java EE 应用程序中,EAR 和 WAR 具有单独的类加载器,其中 EAR 的加载器充当父加载器。当共享库与 WebSphere 中的应用程序关联时,其内容将添加到 EAR 加载器的类路径中。如果共享库中的类需要对 WAR 中打包的类的可见性,则会出现问题,因为父加载器无法“看到”它们的子加载器。 WebSphere 允许您将共享库与应用程序或应用程序中的一个或多个 Web 模块相关联,这会更改该库的类路径附加到的类加载器。

假设我正确理解了resolveClass的打包和行为,我认为解决方案应该相当简单 - 不要将共享库与应用程序关联,而是将其与包含不包含该类的Web模块关联被发现(请注意,您还需要删除 EAR 级关联,否则它只会从那里加载 Spring 类,并且会出现相同的问题)。这将使 WAR 路径和共享库路径进入同一个类加载器,从而消除层次结构问题。

请注意,即使我的假设是正确的,如果您为共享库选择了“使用隔离的类加载器”选项,该解决方案也将不起作用 - 该设置会创建一个单独的类加载器,该类加载器作为某种方式运行它是与其关联的 WAR/EAR 的父级,因此即使它与 WAR 适当关联,它仍然无法看到 WAR 中的类。如果存在需要隔离类加载行为的 jar,则必须将 WAR 类重新定位到共享库,或者将 Spring 内容放回到 WAR 中。

关于java - 无法反序列化 HTTP 调用程序远程服务的结果 [...];嵌套异常是 java.lang.ClassNotFoundException :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59654605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com