This is an old post, refers to Clojure.org for details on how gen-class works now.
Although generating a servlet class is a canonical example of using Clojure's genclass I had never do this — I've used a handmade ClojureServlet which predates genclass.
Today, as I was starting a new project, I decided to get rid of this legacy ClojureServlet and to generate a brand new one.
Right at the end of genclass.clj there's the following example:
(clojure/gen-and-save-class "/Users/rich/dev/clojure/gen/"
'org.clojure.ClojureServlet
:extends javax.servlet.http.HttpServlet)
I changed the path, created the directory structure (
gen-and-save-class
doesn't create the org/clojure/
directories) and ran this code (NB: servlet-api.jar must be on the classpath). Et voilĂ , org/clojure/ClojureServlet.class
!Now to the Clojure code, I created
org/clojure/ClojureServlet.clj
to define the methods and launched Tomcat to test the servlet. It crashed in the init
method.In
org/clojure/ClojureServlet.clj
I have:(in-ns 'org.clojure.ClojureServlet)
(clojure/refer 'clojure)
(defn init [this config]
;censored
)
Cause: init does not call super.init(ServletConfig) as GenericServlet mandates it. Hopefully GenericServlet provides an init() which is easier to override, so I changed the code to:
(in-ns 'org.clojure.ClojureServlet)which override only the init method taking no arguments. The bug was fixed.
(clojure/refer 'clojure)
(defn init-void [this]
;censored, again
)
To override a specific signature, define a var named
methodName-firstArgClassName-secondClassName...
(e.g. init-ServletConfig) or methodName-void
if no arguments.
No comments:
Post a Comment