【问题标题】:ClassNotFoundException when reading object from ObjectInputStream从 ObjectInputStream 读取对象时出现 ClassNotFoundException
【发布时间】:2018-05-20 18:34:16
【问题描述】:

总的来说,我对 Spring MVC 和 webapps 还是很陌生。我一直在尝试制作一个通过套接字的输出流读取对象的项目。当我在一个单独的项目中尝试套接字连接和我的对象时,只有一个简单的主类,inputStream.readObject() 工作并读出TradeRecord。但是当我将它结合到我的测试 Springmvc 项目中时,我的 TradeRecord 会得到一个 ClassNotFoundException

我的 controller.java 类的一部分:

public void readRecord(){
    try {
        Socket socket = connectServer();
        ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
        while (true) {
            TradeRecord rec = (TradeRecord) inputStream.readObject();
            System.out.println(inputStream.readObject());
        }
    } catch (SocketException se) {
        se.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e){
        e.printStackTrace();
    }
}

TradeRecord 类,直接从发送对象的人那里复制:

package models;
import java.io.Serializable;

public class TradeRecord implements Serializable
{
    public static final int STATUS = 0;
    ...
    public String TradeID;
    public char OrdStatus;
    public char TimeInForce;
    ...

    public int timeOnList = 0;
    public String venueID = "";
    public String sourceID = "";
    public String errMsg = "";
}

调度员:

<mvc:annotation-driven />
<context:component-scan base-package="controllers"/>
<mvc:resources mapping="/bootstrap/**" location="/bootstrap/" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>

web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

和错误:

java.lang.ClassNotFoundException: TradeRecord
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1702)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1547)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)

我尝试将 TradeRecord 制作成一个 jar 并手动将其添加到我的外部库中,在我的 WEB-INF 的库下,以及在 Tomcat 的库下(在不同的情况下)。我还尝试将 POJO 放在基本控制器包下,以查看是否可以在那里找到它,但都没有工作。任何帮助将不胜感激。谢谢!

edit* 我目前正在使用 Intellij IDEA 2017.1.1 并使用 maven 进行构建。

【问题讨论】:

  • java.lang.ClassNotFoundException 为什么不包含你的类的包名models
  • 如果您将一个类TradeRecord 复制到另一个包模型,您将创建另一个不同的类,具有不同的名称:models.TradeRecord。使用序列化已经是一个坏主意,但是通过将源代码从一个项目复制到另一个项目来使用它更糟糕。在两边使用完全相同的编译类。
  • @tsolakp 我不确定...我认为它仍在尝试使用从另一台机器发送的TradeRecord
  • 正如 JB Nizet 提到的,确保您在主程序和 WEB-INF jar 文件中使用相同的编译类。
  • @JBNizet 我已经尝试过制作一个简单的可运行项目,该项目连接到同一个套接字并尝试使用我复制的类读取记录。尽管该类是在两台不同的机器上编译的,但它仍然可以读取对象。感觉可能是我没有正确设置的Tomcat的某种配置,因为它找不到TradeRecord

标签: java spring-mvc tomcat objectinputstream


【解决方案1】:

Tomcat 找不到 TradeRecord 类,因为它不存在。唯一需要的“配置”是将其放入源和目标的同一个包中,并将类包含在 WAR 中或在其 lib 目录中包含它的依赖 JAR 之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2013-07-07
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多