Pregunta

Mientras que el uso de Usa servidores proxy, fns pasa proxy debe reemplazar los métodos existentes o son llamados en conjunto con super.method()?

En el código siguiente, RequestHandler.get() se invoca junto con el proxy get [].

;see: http://github.com/paulosuzart/JTornado
(ns org.ctornadoweb)
(import '(org.jtornadoweb Web$RequestHandler))
(import '(org.jtornadoweb HttpServer Web$Application))


(let [myHandler (proxy [Web$RequestHandler] [] 
                  (get [] 
                    (.write "Hi CLJ"))
                  (post []
                    (.write "POST")))]

(.listen
  (HttpServer.  
    (.add (Web$Application.) "/" (class myHandler))
    false nil false) 8089))

Lo mismo ocurre con el compilado/la herencia de la versión:

; Starts a JTornado HTTP Server and a sample RequestHandler.
; Bit verbose due to compilation directives. Recommendation is to generate 
; a set of macros to hide this.
(ns org.ctornadoweb
; Compiled and implements a static main method to start the server
  (:import (org.jtornadoweb HttpServer)
           (org.jtornadoweb.Web$Application)
           (org.jtornadoweb.Web$RequestHandler))
  (:gen-class :prefix "server-"))

(gen-class
 :name org.ctornadoweb.MyHandler
 :extends org.jtornadoweb.Web$RequestHandler
 :prefix "do")

(defn do-get [this]
  "Handles the HTTP GET method"
  (.write "hello clojure"))
(defn do-post [this]
  "Handles the HTTP POST method"
  (.write (.getArgument "name" "default" false)))


(defn server-main []
  "main method"
 (.listen
  (org.jtornadoweb.HttpServer.
   (.add (org.jtornadoweb.Web$Application.) "/" org.ctornadoweb.MyHandler)
     false nil false) 8089))

;use (compile 'org.ctornadoweb)

El seguimiento muestra el proxy conseguir que se invoca y, a continuación, el súper.se, lo que arroja (por defecto) una excepción.

HTTP 405: Method Not Allowed 
    at org.jtornadoweb.Web$RequestHandler.get(Web.java:72)
    at org.ctornadoweb.proxy$org.jtornadoweb.Web$RequestHandler$0.get(Unknown Source)

Traté de encontrar algunas palabras sobre el comportamiento real de Clojure Proxies.Alguien puede dar esta ayuda?

¿Fue útil?

Solución

No, el super método no será llamado automáticamente, aunque se puede llamar explícitamente con proxy-super.

El siguiente caso de prueba muestra que las cosas funcionen como deberían:

user=> (def foo 
         (proxy [java.util.ArrayList] [] 
           (clear [] (println "not clearing"))))
#'user/foo
user=> (.size foo)
0
user=> (.add foo "hi")
true
user=> (.add foo "bye")
true
user=> (.size foo)
2
user=> (.clear foo)
not clearing
nil
user=> (.size foo)
2

Si super.clear() estaban recibiendo la llamada, el tamaño se muestran como 0.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top