2017-12-06 2 views
0

Ich bin ziemlich neu zu Spring MVC und Webapps im Allgemeinen. Ich habe versucht, ein Projekt zu machen, das ein Objekt durch den Ausgabestrom eines Sockets liest. Wenn ich die Socket-Verbindung und mein Objekt in einem separaten Projekt mit nur einer einfachen Hauptklasse versuche, funktioniert inputStream.readObject() und liest die TradeRecord aus. Aber wenn ich es in meinem Test Springmvc Projekt kombiniere, bekomme ich eine ClassNotFoundException für meine TradeRecord.ClassNotFoundException beim Lesen von Objekt aus ObjectInputStream

Teil meiner controller.java Klasse:

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 Klasse, die direkt von der Person kopiert wird, sendet das Objekt:

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 = ""; 
} 

Dispatcher:

<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> 

und der Fehler:

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) 

Ich habe versucht, die TradeRecord in ein Gefäß zu machen und es manuell zu meinen externen Bibliotheken hinzufügen, unter dem lib meines WEB-INF und unter dem lib in Tomcat (in getrennten Anlässen). Ich habe auch versucht, das POJO unter das Basis-Controller-Paket zu legen, nur um zu sehen, ob es dort gefunden werden kann, aber nichts davon hat funktioniert. Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

bearbeiten * Ich verwende derzeit Intellij IDEA 2017.1.1 und Gebäude mit Maven.

+1

Wie kommt es, dass java.lang.ClassNotFoundException den Paketnamen 'models' für Ihre Klasse nicht enthält. – tsolakp

+1

Wenn Sie eine Klasse 'TradeRecord' in ein anderes Paketmodell kopieren, erstellen Sie eine andere, andere Klasse mit einem anderen Namen:' models.TradeRecord'. Die Verwendung der Serialisierung ist bereits eine schlechte Idee, aber die Verwendung von Quellcode von einem Projekt zum anderen ist noch schlimmer. Verwenden Sie die genaue, gleiche kompilierte Klasse auf beiden Seiten. –

+0

@tsolakp Ich bin mir nicht sicher ... Ich denke, es ist immer noch versucht, den 'TradeRecord' zu verwenden, der von einem anderen Rechner gesendet wird. – Bluu

Antwort

0

Tomcat kann die Klasse TradeRecord nicht finden, weil sie nicht da ist. Die einzige 'Konfiguration', die benötigt wird, besteht darin, sie in das gleiche Paket an der Quelle und am Ziel zu bringen und die Klasse in die WAR oder eine ihrer abhängigen JARs in ihr Verzeichnis lib aufzunehmen.

Verwandte Themen