【发布时间】:2018-01-21 13:03:45
【问题描述】:
我有以下方法:
package com.streambright.http.handlers;
import org.rapidoid.http.Req;
import org.rapidoid.u.U;
import java.util.Map;
public class EchoHandler {
public static Map<String, String> handleEcho(Req req) {
return U.map(req.headers());
}
}
当我使用它时,它完全没问题:
On.get("/echo").managed(false).json(EchoHandler::handleEcho);
但是,当我尝试在 Clojure 中执行相同操作时,它会因参数数量错误而失败。
处理程序:
(ns s.echo-http-handler
(:import
[org.rapidoid.http Req ]
[org.rapidoid.u U ] )
(:gen-class
:methods [^:static [handler [org.rapidoid.http.Req] java.util.Map]]))
(defn -handler
[Req req]
(U/map (.headers req)))
当我启动服务器时:
(ns s.http
(:require
[s.echo-http-handler :as echo ] )
(:import
[org.rapidoid.config Conf ]
[org.rapidoid.setup On ] ) )
(defn start
[]
(set-http-params!)
(.json (.managed (On/get "/echo") false) echo/-handler))
它启动并抛出以下错误:
clojure.lang.ArityException: Wrong number of args (0) passed to: echo-http-handler/-handler
如何将 req 传递给 Clojure 中的函数?
【问题讨论】:
-
您确定这是 Clojure 问题吗?我不熟悉 Rapidoid,但似乎 it 没有传递所需的参数。是什么决定了
json方法是否将参数传递给给它的函数?从快速搜索来看,似乎它可以同时接受 0 和 1 arity 函数。 -
这归结为能够将 (Req req, Resp resp) -> {return ....} 代码从 Java 移植到 Clojure。我不知道该怎么做。
-
但是,又是什么决定了给 'json` 的回调的数量?是库传递了错误数量的参数。
-
为了使用 Clojure 中的函数式接口,您可以使用
reify创建一个实现该接口的对象。不幸的是,你不能使用简洁的匿名函数语法。