从ObjectInputStream读取对象时的ClassNotFoundException

时间:2017-12-06 19:06:53

标签: 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放在基本控制器包下面,看看它是否可以在那里找到,但没有一个工作。任何帮助将不胜感激。谢谢!

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

1 个答案:

答案 0 :(得分:0)

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