4

我创建了 Compojure入门页面中给出的示例 WAR,并将其部署到 Apache Tomcat 6.0.2 wepapps 文件夹。我使用的 Web.xml 如下:

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

有人在 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)

当我(defservice greeter)

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

我可以运行它并从浏览器访问 URL。

但是,当我从 Apache Tomcat 运行它时,我仍然面临同样的问题。

4

2 回答 2

5

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

如果这些都不能解决问题,请为我们发布更多信息,例如您的路由表。

于 2009-12-27T21:55:20.787 回答
5

该问题恰好与"/"在 defroutes 中使用 . 而不是"/*". 如果我将 defroutes 定义为:

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

它适用于 Apache Tomcat 6。

于 2010-01-11T18:02:23.953 回答