使用部署在Apache Tomcat上的Clojure创建的WAR无法运行Servlet

Aru*_*n R 3 tomcat clojure compojure

我创建了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>
Run Code Online (Sandbox Code Playgroud)

访问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)
Run Code Online (Sandbox Code Playgroud)

我已经将Clojure,Clojure contrib jars包含在WEB-INF / lib文件夹中。

是否有人在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 Code Online (Sandbox Code Playgroud)

当我更换了(defservice greeter)

(run-server {:port 8080}
  "/*" (servlet greeter))
Run Code Online (Sandbox Code Playgroud)

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

但是,当我从Apache Tomcat运行此程序时,仍然会遇到相同的问题。

Pau*_*ato 5

1)您实际上定义了路线吗?听起来似乎是一个显而易见的起点。确保您的路由表存在并且正确定义。您需要类似:

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

2)尝试在Jetty中启动您的应用程序。如果在Jetty下也不起作用,并且出现相同的错误,则您的问题不在WAR部署中,而在应用程序中。

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

如果以上方法均不能解决问题,请为我们发布更多信息,例如您的路由表。


Aru*_*n R 5

"/"该问题恰好与defroutes 中使用 而非 有关"/*"。如果我将 defroutes 定义为:

(defroutes greeter
    (GET "/*"
        (html [:h1 "Hello World"])))
Run Code Online (Sandbox Code Playgroud)

它适用于 Apache Tomcat 6。