6

我在这里使用的某个地方让java.rmi.server.UIDGAE 感到不安。在 :only'ing 我对骨头的依赖之后,我陷入了僵局。

(ns helloworld.core
  (:use ;[hiccup.core]
        [hiccup.page-helpers :only (html5 include-css)]
        [clojure.contrib.string :only (split)]
        [compojure.core :only (defroutes GET)]
        [hiccup.middleware :only (wrap-base-url)])
  (:require [appengine-magic.core :as ae]
            [compojure.route :as route
              :only (resources not-found) ]
            [compojure.handler :as handler :only (site)])
  (:gen-class :extends javax.servlet.http.HttpServlet))

 (defn index-page
  ([name]
     (html5
      [:head
       [:title (str "Hello " name)]
       (include-css "/css/style.css")]
      [:body
       [:h1 (str "Hello " name)]]))
  ([] (index-page "World")))

(def match-opperator
  { "add"      +
    "subtract" -
    "multiply" *
    "divide"   /})

(defroutes hello-routes
  (GET "/:f/*" [f & x]
       (index-page (apply (match-opperator f)
                          (map #(Integer/parseInt %)
                               (split #" " (:* x))))))
  (GET "/" [] (index-page))
  (route/resources "/")
  (route/not-found "Page not found"))

(def app
     (-> (handler/site hello-routes)
         (wrap-base-url)))

(ae/def-appengine-app helloworld-app #'app)

我可以将它加载到码头并且它工作正常,在将它加载到 dev-appserver 之后我得到了这个:

HTTP 错误 500

访问 /multiply/1%202%204%208 时出现问题。原因:

    java.rmi.server.UID 是一个受限类。有关详细信息,请参阅 Google App Engine 开发人员指南。

造成的:

java.lang.NoClassDefFoundError: java.rmi.server.UID 是一个受限类。有关详细信息,请参阅 Google App Engine 开发人员指南。
    在 com.google.appengine.tools.development.agent.runtime.Runtime.reject(Runtime.java:51)
    在 org.apache.commons.fileupload.disk.DiskFileItem.(DiskFileItem.java:103)
    在 java.lang.Class.forName0(本机方法)
    在 java.lang.Class.forName(Class.java:186)
    在 ring.middleware.multipart_params$loading__4414__auto__.invoke(multipart_params.clj:1)
    在 ring.middleware.multipart_params__init.load(未知来源)
    在 ring.middleware.multipart_params__init.(未知来源)
    在 java.lang.Class.forName0(本机方法)
    在 java.lang.Class.forName(Class.java:264)
    在 clojure.lang.RT.loadClassForName(RT.java:1578)
    在 clojure.lang.RT.load(RT.java:399)
    在 clojure.lang.RT.load(RT.java:381)
    在 clojure.core$load$fn__4519.invoke(core.clj:4915)

ps:这是我的 project.clj 以防这有帮助:

(defproject helloworld "1.0.0-SNAPSHOT"
  :description "FIXME: 写描述"
  :依赖项[[org.clojure/clojure“1.2.1”]
                 [org.clojure/clojure-contrib “1.2.0”]
                 [组合“0.6.2”]
                 [打嗝“0.3.4”]]

  :dev-dependencies [[appengine-magic "0.4.1"]
                     [swank-clojure "1.2.1"]])
4

1 回答 1

6

FWIW 我认为:only不会对 GAE 产生任何影响。它可能正在监视您加载的类,并且拒绝refer某个函数并不会阻止其代码被加载。

除了查看堆栈跟踪之外没有特定领域的经验,我认为导致问题的处理程序可能compojure.handler/sitewrap-multipart-params. 我怀疑您的应用程序是否需要该功能,所以看看您是否可以使用compojure.handler/api. 然后,如果您确实需要特定的包装器site,请手动将它们包装起来。

再说一次,考虑到我之前关于加载类的观点,我猜想你的命名空间的代码multipart-params就会被加载,所以你之后做什么可能并不重要。我想您甚至可能只需要手动进行所有包装;这不是很复杂。然后你应该能够避免使用 multipart-params 命名空间。requirecompojure.handlerapisiterequire

于 2011-05-31T03:25:10.257 回答