【发布时间】: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