java - 从 ObjectInputStream 读取对象时出现 ClassNotFoundException

标签 java spring-mvc tomcat objectinputstream

总的来说,我对 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 的 lib 下,以及在 Tomcat 的 lib 下(在不同的场合)。我还尝试将 POJO 放在基本 Controller 包下,看看是否可以在那里找到它,但没有一个起作用。任何帮助将不胜感激。谢谢!

编辑* 我目前正在使用 Intellij IDEA 2017.1.1 并使用 Maven 进行构建。

最佳答案

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

关于java - 从 ObjectInputStream 读取对象时出现 ClassNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47681735/

相关文章:

java - 以编程方式添加时 GridLayout 溢出屏幕

java - API需要GET方法但需要发送参数

java - Spring MVC、JSON、长度超过 1000 个字符的字符串字段的错误序列化

java - 在与 8080 不同的端口上从浏览器打开 tomcat

maven - 使用 JSF 项目运行 Tomcat8 时出错?

java - 如何使用 Java 以编程方式从 MS Exchange Server 获取电子邮件 header ?

java - 你能以编程方式配置 Spring-Security 吗?

java - 将 Java 10 与 Spring MVC 5 结合使用

java - Spring 3 : @OneToOne unidirectional generate java. sql.SQLException: ORA-00918

java - 转发 header 在 Spring Boot + Kubernetes 中不起作用