总的来说,我对 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/