2014-02-19 5 views
17

Ich versuche, eine Demo von Feder Web-Socket ausführen, aber nicht in der Lage, es vollständig zu testen. Ich benutze Java 7 und Tomcat 7.0.50. Ich bekomme keinen Fehler während des Serverstarts, aber wenn ich die Webseite mit js öffne, die die Verbindung herstellt, habe ich 404 Seite nicht gefunden. Ich bin nicht sicher, ob ich irgendetwas in der Konfiguration vermisse, um es laufen zu lassen, und wie ich in der Lage sein werde, es von js Seite zu verbinden.Nicht in der Lage, Feder Web Socket Demo

Ich habe folgende XML-Datei:

<beans ....> 
    <context:annotation-config /> 

    <websocket:message-broker 
     application-destination-prefix="/app"> 
     <websocket:stomp-endpoint path="/hello"> 
      <websocket:sockjs /> 
     </websocket:stomp-endpoint> 
     <websocket:simple-broker prefix="/topic" /> 
    </websocket:message-broker> 
</beans> 

Mein Controller-Klasse ist:

@Controller 
public class SwsService { 
    @MessageMapping("/hello") 
    @SendTo("/topic/greetings") 
    public Greeting greeting(HelloMessage message) throws Exception { 
     return new Greeting("Hello, " + message.getName() + "!"); 
    } 

    public String getGreeting() { 
     return "Hello, you are in!"; 
    } 
} 

Die js aus dem ich das nenne, ist:

var sock = new SockJS("/hello"); 
sock.onopen = function() { 
    console.log("open"); 
}; 
sock.onclose = function() { 
    console.log("closed"); 
}; 
sock.onmessage = function (message) { 
    console.log("msg", message); 
}; 

Die Konsole ausgegeben, wenn Ich betreibe den Kater:

Feb 19, 2014 3:28:47 PM org.apache.catalina.core.AprLifecycleListener init 
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\Program Files\Java\jre7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre6/bin/client;C:/Program Files/Java/jre6/bin;C:/Program Files/Java/jre6/lib/i386;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\OpenCL SDK\2.0\bin\x86;C:\Program Files\TortoiseGit\bin;C:\Python24;C:\Program Files\TortoiseSVN\bin;C:\Program Files\nodejs\;C:\Program Files\Git\cmd;C:\Users\harsh\AppData\Roaming\npm;E:\IDE\eclipse_indigo;;. 
Feb 19, 2014 3:28:47 PM org.apache.tomcat.util.digester.SetPropertiesRule begin 
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:SWS' did not find a matching property. 
Feb 19, 2014 3:28:48 PM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["http-bio-8080"] 
Feb 19, 2014 3:28:48 PM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["ajp-bio-8009"] 
Feb 19, 2014 3:28:48 PM org.apache.catalina.startup.Catalina load 
INFO: Initialization processed in 1412 ms 
Feb 19, 2014 3:28:48 PM org.apache.catalina.core.StandardService startInternal 
INFO: Starting service Catalina 
Feb 19, 2014 3:28:48 PM org.apache.catalina.core.StandardEngine startInternal 
INFO: Starting Servlet Engine: Apache Tomcat/7.0.50 
Feb 19, 2014 3:28:51 PM org.apache.catalina.core.ApplicationContext log 
INFO: No Spring WebApplicationInitializer types detected on classpath 
Feb 19, 2014 3:28:51 PM org.apache.catalina.core.ApplicationContext log 
INFO: Initializing Spring root WebApplicationContext 
Feb 19, 2014 3:28:51 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization started 
Feb 19, 2014 3:28:51 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh 
INFO: Refreshing Root WebApplicationContext: startup date [Wed Feb 19 15:28:51 IST 2014]; root of context hierarchy 
Feb 19, 2014 3:28:52 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/classes/conf/SwsContext.xml] 
Feb 19, 2014 3:28:53 PM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize 
INFO: Initializing ExecutorService 'clientInboundChannelExecutor' 
Feb 19, 2014 3:28:53 PM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize 
INFO: Initializing ExecutorService 'clientOutboundChannelExecutor' 
Feb 19, 2014 3:28:53 PM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize 
INFO: Initializing ExecutorService 'messageBrokerSockJsScheduler' 
Feb 19, 2014 3:28:53 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler 
INFO: Mapped URL path [/hello/**] onto handler of type [class org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler] 
Feb 19, 2014 3:28:53 PM org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup start 
INFO: Starting beans in phase 2147483647 
Feb 19, 2014 3:28:53 PM org.springframework.web.context.ContextLoader initWebApplicationContext 
INFO: Root WebApplicationContext: initialization completed in 2173 ms 
Feb 19, 2014 3:28:53 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"] 
Feb 19, 2014 3:28:53 PM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["ajp-bio-8009"] 
Feb 19, 2014 3:28:53 PM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 5842 ms 

Der Browser Konsolenausgabe:

GET http://localhost:8080/hello/info 404 (Not Found) sockjs-0.3.min.js:27 
closed 

Wie kann ich es erfolgreich testen?


Updates

Ich versuchte auch, um von hier aus das Portfolio Beispiel läuft: https://github.com/rstoyanchev/spring-websocket-portfolio wie von @jhadesdev

Aber es hilft auch nicht. Wenn ich laufen mvn tomcat7:run sehe ich folgende Ausgabe und offene url auf Browser anweist 404.

[INFO] Scanning for projects... 
[INFO] 
[INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethrea 
ded.SingleThreadedBuilder with a thread count of 1 
[INFO] 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building spring-websocket-portfolio 1.0.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ spring-websocket-portfol 
io >>> 
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ spring-web 
socket-portfolio --- 
[debug] execute contextualize 
[INFO] Using 'UTF-8' encoding to copy filtered resources. 
[INFO] skip non existing resourceDirectory E:\libraries\spring-websocket-portfol 
io\src\main\resources 
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ spring-websoc 
ket-portfolio --- 
[INFO] No sources to compile 
[INFO] 
[INFO] <<< tomcat7-maven-plugin:2.2:run (default-cli) @ spring-websocket-portfol 
io <<< 
[INFO] 
[INFO] --- tomcat7-maven-plugin:2.2:run (default-cli) @ spring-websocket-portfol 
io --- 
[INFO] Running war on http://localhost:8080/spring-websocket-portfolio 
[INFO] Using existing Tomcat server configuration at E:\libraries\spring-websock 
et-portfolio\target\tomcat 
[INFO] create webapp with contextPath: /spring-websocket-portfolio 
Feb 27, 2014 10:20:46 AM org.apache.coyote.AbstractProtocol init 
INFO: Initializing ProtocolHandler ["http-bio-8080"] 
Feb 27, 2014 10:20:46 AM org.apache.catalina.core.StandardService startInternal 
INFO: Starting service Tomcat 
Feb 27, 2014 10:20:46 AM org.apache.catalina.core.StandardEngine startInternal 
INFO: Starting Servlet Engine: Apache Tomcat/7.0.47 
Feb 27, 2014 10:20:49 AM org.apache.catalina.core.ApplicationContext log 
INFO: No Spring WebApplicationInitializer types detected on classpath 
Feb 27, 2014 10:20:49 AM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"] 

Es dort stecken und nicht voran geht.

+0

Hallo Harry. Ich denke, dass das Problem ist, dass Sie die Wurzel Ihres Projekts vermissen, wenn Sie ein neues SockJS-Objekt erstellen. Sie können versuchen var sock = new SockJS ("/ myProject/hallo"); oder mit c: url. –

+0

@Evgeni Ich versuchte das auch, aber immer noch seine 404 zu sagen. :( –

+0

@HarryJoy - hast du mit der vollen URL auch versucht? –

Antwort

1

This Die Chrome-Erweiterung kann Ihnen beim Testen von Websockets helfen.

Auch können Sie einen Blick auf meine simple-chat Projekt, das Spring Boot mit Websockets verwendet.

2

Versuchen Sie, einen Assets-Ordner in webapp hinzuzufügen, in dem alle Dateien stomp und sockjs.js verfügbar sind. Sehen Sie sich dieses Beispiel einer running application an, die mit mvn clean install jetty:run ausgeführt werden kann.

Das Problem scheint zu sein, dass entweder der Sockjs nicht auf dem Server ist oder ein Pfad falsch ist.

@EnableWebSocketMessageBroker 
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 
    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/portfolio").withSockJS(); 
    } 

} 

Dann in Javascript, um das Punktende kann wie folgt aufgerufen werden: Am Beispiel auf den Link kann ein stampfen Endpunkt configured like this sein

var socket = new SockJS('/spring-websocket-portfolio/portfolio') 
var stompClient = Stomp.over(socket); 

wo /spring-websocket-portfolio ist die Wurzel Bereitstellungspfad Ihrer Anwendung.

+0

siehe die Updates in. Ich habe es versucht, aber es funktioniert nicht. :( –

1

Ihre Anwendung sieht gut aus.

Sie sollten JavaScript-Anforderungen unbedingt mit dem Stammkontext Ihrer Anwendung als jhadesdev mentioned voranstellen.

Werden in Ihrer Anwendung zusätzliche Filter registriert oder Nachrichtenkonverter angepasst? Vielleicht stört hier ein anderes Konfigurationselement.

Die neueste Portfolio Beispiel sollte auf jeden Fall arbeiten, sind hier einige Fragen:

  1. Können Sie uns sagen, mehr über Ihre Client-Setup (Browser, Version)?
  2. Unterstützt Ihr Browser Websocket (testen Sie es there)?
  3. Könnten Sie auch im Inkognito-Modus versuchen (vielleicht ist hier eine Browsererweiterung eines Drittanbieters schuld)?
  4. Könnten Sie überprüfen, ob Ihr Browser keinen HTTP-Proxy für Localhost-Anfragen verwendet?
  5. Könnten Sie überprüfen, ob dieses HTTP 404 im Tomcat-Zugriffsprotokoll enthalten ist? (und sehen, ob Sie etwas Interessantes in denen oder in catalina.out haben?)
+1

1. Google Chrome 33 2. ja 3. versucht, aber das gleiche Ergebnis 4. Nein ist es nicht. –

+0

Ja, ich habe versucht, Präfix der Root-Kontext in URL hinzuzufügen, aber das hat auch nicht geholfen. :( –

+0

habe gerade meine Antwort mit einem fünften Punkt bearbeitet. –

9

Ich war mit dem gleichen Problem konfrontiert. Dieser Thread gab mir genügend Hinweise, um das Problem zu lösen. Danke vielmals.

LÖSUNG: Falls Sie ein Spring MVC Dispatcher Servlet in web.xml konfiguriert und auf eine URL-Muster abgebildet, wie unten gezeigt

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>/webui/*</url-pattern> 
</servlet-mapping> 

Dann müssen Sie die SockJS Instanz erstellen, wie unten gezeigt

var socket = new SockJS('/contextPath/webui/hello'); 

HINWEIS: Ersetzen contextPath mit y unser Anwendungskontextpfad.

+0

geholfen. Danke. Mir ist aufgefallen, dass das Beispiel aus der Spring Boot-JAR-Datei lief. Es funktionierte zwar gut, aber wenn es in einen Krieg konvertiert wurde, brauchte es einen Kontextpfad. –

1

Wie wird Ihr DispatcherServlet zugeordnet? Here das könnte was du suchst