How to genclass a servlet
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) (clojure/refer 'clojure) (defn init-void [this] ;censored, again )
which override only the init method taking no arguments. The bug was fixed.
methodName-firstArgClassName-secondClassName...
(e.g. init-ServletConfig) or methodName-void
if no arguments.