2009-12-27 66 views
3

我創建了Compojure Getting Started Page中給出的示例WAR,並將其部署到Apache Tomcat 6.0.2 wepapps文件夾。我用Web.xml中是如下:使用部署在Apache Tomcat上的Clojure創建的WAR不運行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> 

訪問URL引發以下錯誤

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) 

我已經包含在WEB-INF/lib文件夾中的Clojure,Clojure的的contrib罐子。

有沒有人遇到Apache Tomcat上的Clojure WAR類似的問題?

我試圖運行的Servlet是:

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

當我與

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

取代(defservice greeter)我能夠從瀏覽器中運行這個和訪問URL。

但是,當我從Apache Tomcat運行這個時,我仍然面臨同樣的問題。

回答

4

問題發生在使用"/"而不是"/*"。如果我定義了defroutes爲:

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

它可以在Apache Tomcat 6

4

1)您是否確實定義了路線?聽起來像是一個明顯的起點。確保你的路由表存在並且被正確定義。你需要這樣的東西:

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

2)嘗試在Jetty中啓動你的應用程序。如果它不能在Jetty下運行,並且出現相同的錯誤,那麼您的問題不在WAR部署中,而是在應用程序中。

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

如果這些都不能解決它,請爲我們發佈一些更多信息,例如您的路由表。

+0

我添加了下面來測試我的Servlet,這運行正常。 (run-server {:port 8090} \t「/ *」(servlet greeter)) – 2009-12-28 17:52:17