2009-12-27 4 views
3

J'ai créé l'exemple WAR comme indiqué dans Compojure Getting Started Page et l'ai déployé dans le dossier wepapps Apache Tomcat 6.0.2. Le Web.xml j'est comme ci-dessous:WAR créé à l'aide de Clojure déployé sur Apache Tomcat ne s'exécute pas Servlet

<web-app> 
<servlet> 
    <servlet-name>myservlet</servlet-name> 
    <servlet-class>myapp.MyServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>myservlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 
</web-app> 

Accès à l'URL suivante génère l'erreur

java.lang.NullPointerException: Handler returned nil (maybe no routes matched URI) 
    compojure.http.servlet$request_handler__72.invoke(servlet.clj:110) 
    myapp.MyServlet$_service__108.invoke(MyServlet.clj:11) 
    myapp.MyServlet.service(Unknown Source) 

J'ai inclus les pots contrib Clojure, Clojure dans le dossier WEB-INF/lib.

Est-ce que quelqu'un a rencontré un problème similaire avec les WAR Clojure sur Apache Tomcat?

Servlet Je suis en train de courir est:

;; src/myapp/MyServlet.clj 
(ns myapp.MyServlet 
    (:use compojure) 
    (:gen-class 
     :extends javax.servlet.http.HttpServlet)) 

(defroutes greeter 
    (GET "/" 
     (html [:h1 "Hello World"]))) 

(defservice greeter) 

Lorsque j'ai remplacé le (defservice greeter) avec

(run-server {:port 8080} 
    "/*" (servlet greeter)) 

Je suis en mesure d'exécuter cette URL et d'accès du navigateur. Cependant, lorsque j'exécute cela à partir d'Apache Tomcat, je suis toujours confronté au même problème.

Répondre

4

Le problème s'est avéré être lié à l'utilisation de "/" dans les defroutes au lieu de "/*". Si je définir les defroutes comme:

(defroutes greeter 
    (GET "/*" 
     (html [:h1 "Hello World"]))) 

Il fonctionne sur Apache Tomcat 6.

4

1) Avez-vous réellement défini des routes? Cela ressemble à un endroit évident pour commencer. Assurez-vous que votre table de routage existe et est correctement définie. Vous avez besoin de quelque chose comme:

(defroutes webservice 
    (GET "/some-route/" 
    some-function-name))) ;; more complicated variations are possible, of course 

2) Essayez de démarrer votre application dans Jetty. Si cela ne fonctionne pas sous Jetty non plus, avec la même erreur, votre problème ne se trouve pas dans le déploiement de WAR mais dans l'application.

(defserver webserver 
      {:port 8080} 
      "/*" (servlet webservice)) 
(start main-server) ;; starts a Jetty webserver on 8080 

Si aucune de ces solutions ne vous permet de résoudre le problème, envoyez-nous plus d'informations, telles que votre table de routage.

+0

j'ajouté ce qui suit pour tester mon Servlet et cela fonctionne très bien. (run-server {: port 8090} \t "/ *" (servlet greeter)) –

Questions connexes