【问题标题】:Number format exception in compojurecompojure 中的数字格式异常
【发布时间】:2012-04-02 16:53:33
【问题描述】:

作为完全 clojure 菜鸟,我正在尝试启动一个小型教程应用程序,以熟悉 compojure。这是一个小应用程序,它允许用户添加两个数字,然后单击按钮在另一页上显示它们的总和。我听从了 Mark McGranaghan blog 的指示。一切似乎都很好,直到我尝试得到我输入的两个数字的总和,而不是得到结果,我被重定向到同一页面(所以基本上我被困在本教程的第一步)。检查代码后,似乎在进行输入解析时触发了 NumberFormatException(出于某种原因)。在我所有的测试中,我都尝试输入各种数字格式,但没有成功。这是最简单的代码版本,作者说应该可以工作(我已经尝试了github site的最新版本-相同的场景:NFE):

    (ns adder.core
  (:use compojure.core)
  (:use hiccup.core)
  (:use hiccup.page-helpers))

(defn view-layout [& content]
  (html
    (doctype :xhtml-strict)
    (xhtml-tag "en"
      [:head
        [:meta {:http-equiv "Content-type"
                :content "text/html; charset=utf-8"}]
        [:title "adder"]]
      [:body content])))

(defn view-input []
  (view-layout
    [:h2 "add two numbers"]
    [:form {:method "post" :action "/"}
      [:input.math {:type "text" :name "a"}] [:span.math " + "]
      [:input.math {:type "text" :name "b"}] [:br]
      [:input.action {:type "submit" :value "add"}]]))

(defn view-output [a b sum]
  (view-layout
    [:h2 "two numbers added"]
    [:p.math a " + " b " = " sum]
    [:a.action {:href "/"} "add more numbers"]))

(defn parse-input [a b] ;; this is the place where problem occures
  [(Integer/parseInt a) (Integer/parseInt b)])

(defroutes app
  (GET "/" []
    (view-input))

  (POST "/" [a b]
    (let [[a b] (parse-input a b)
          sum   (+ a b)]
      (view-output a b sum)))

谁能告诉我更好的方法来解析输入值,以避免这种异常?我尝试了几种技术,但对我没有任何帮助。我在 win 7 机器上使用 Leningen v1.7.1 和 clojure 1.3。

这是我的 project.clj 文件的内容:

(defproject adder "0.0.1"
  :description "Add two numbers."
  :dependencies
    [[org.clojure/clojure "1.3.0"]
     [org.clojure/clojure-contrib "1.1.0"]
     [ring/ring-core "1.0.2"]
     [ring/ring-devel "1.0.2"]
     [ring/ring-jetty-adapter "1.0.2"]
     [compojure "1.0.1"]
     [hiccup "0.3.8"]]
  :dev-dependencies
    [[lein-run "1.0.0"]])

并运行.clj 脚本:

(use 'ring.adapter.jetty)
(require 'adder.core)

(let [port (Integer/parseInt (get (System/getenv) "PORT" "8080"))]
  (run-jetty #'adder.core/app {:port port}))

谢谢。

【问题讨论】:

    标签: clojure compojure numberformatexception


    【解决方案1】:

    您使用的是 compojure 1.0.1,您关注的博客中的示例使用的是 compojure 0.4.0。

    从 0.6.0 版开始,Compojure 不再向路由添加默认中间件。这意味着您必须将 wrap-params 和 wrap-cookies 中间件显式添加到您的路由中。

    来源:https://github.com/weavejester/compojure

    所以您需要显式添加 wrap-params 中间件。因此需要进行以下更改...

    (ns adder.core
      (:use                    ; change to idiomatic usage of :use
        [compojure.core] 
        [hiccup.core]
        [hiccup.page-helpers]
        [ring.middleware.params :only [wrap-params]])) ; add middleware for params
    
    (defn view-layout [& content]
      (html
        (doctype :xhtml-strict)
        (xhtml-tag "en"
              [:head
               [:meta {:http-equiv "Content-type"
                       :content "text/html; charset=utf-8"}]
               [:title "adder"]]
              [:body content])))
    
    (defn view-input []
        (view-layout
         [:h2 "add two numbers"]
         [:form {:method "post" :action "/"}
         [:input.math {:type "text" :name "a" :id "a"}] [:span.math " + "]
         [:input.math {:type "text" :name "b" :id "a"}] [:br]
         [:input.action {:type "submit" :value "add"}]]))
    
    (defn view-output [a b sum]
      (view-layout
       [:h2 "two numbers added"]
       [:p.math a " + " b " = " sum]
       [:a.action {:href "/"} "add more numbers"]))
    
    (defn parse-input [a b]
      [(Integer/parseInt a) (Integer/parseInt b)])
    
    (defroutes main-routes             ; needs to be renamed
       (GET "/" []
          (view-input))
    
       (POST "/" [a b]
          (let [[a b] (parse-input a b)
              sum   (+ a b)]
          (view-output a b sum))))
    
    (def app (wrap-params main-routes)) ; wrap the params to allow destructuring to work
    

    【讨论】:

    • 感谢您的回复,我会尽快尝试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多