Clojure web app sql在部署到Tomcat

时间:2016-04-25 19:39:36

标签: sql tomcat clojure web-deployment

下午好,

我使用的是Clojure 1.8,PostgreSQL 9.4和YeSQL 0.5.2

我有一个网页应用,其中有一个页面可插入多个价格。我使用Post方法从HTML表单中获取价格。它来自我的矢量地图。我将其转换为地图矢量,因此更容易操纵数据。然后我删除以前的条目,如果存在,我对字段进行处理,并调用数据库事务插入数据库。

当我使用lein ring server时,它运行正常。但是当我使用lein ring uberwar部署到Tomcat 9时,应用程序只插入最后一行。

以下是我的网页:

Each table row will be a SQL Insert

表中的每一行都是一个SQL Insert

我的联系:

(ns satus-cotacao.model.connection)

(def db-spec {:classname "org.postgresql.Driver"
              :subprotocol "postgresql"
              :subname "//localhost/database"  ;; 192.168.0.x:port when using other database from the internal network.
              :user "root"
              :password "root"})

我的defqueries

(ns satus-cotacao.model.cotacao_model
  (:require ...
            [satus-cotacao.model.connection :refer [db-spec]]
            ...)

(defqueries "satus_cotacao/model/cotacao.sql"
            {:connection db-spec})

使用表单作为参数

调用lcto-cotacao-page的Post请求
POST "/cotacao/:cod" [cod & form :as session] (lcto-cotacao-page cod form session))

调用Delete和Insert函数的lcto-cotacao-page函数。

(defn lcto-cotacao-page
  [cod lcto session]
  (try
    (cotacao/deleta-lcto-cotacao! cod (:identity session))
    (cotacao/insere-lctos-cotacoes! cod (:identity session) lcto)
    (layout/render "home.html" {:session session})
    (catch Exception e
      (do
        (timbre/error e)))))

delete-lcto-cotacao!函数和SQL查询

(defn deleta-lcto-cotacao!
  [codcotacao enti_codigo]
  (jdbc/with-db-transaction [tx db-spec]
                            (delete-lcto-cotacao! {:codcotacao codcotacao 
                                                   :enti_codigo enti_codigo} 
                                                  {:connection tx})))
-- name: delete-lcto-cotacao!
DELETE FROM lctocotacao
WHERE lcco_codentidade = :enti_codigo
AND lcco_codcontrole = :codcotacao

删除工作正常,删除所有条目。

insere-lctos-cotacoes!从矢量地图转换为地图矢量并通过此矢量创建递归调用

(defn insere-lctos-cotacoes!
  [cod enti lctos]
  (if (vector? (:lcco_codprod lctos))
    (let [lcto-vec (util/from-map-of-vector-to-vector-of-maps lctos)]
      (loop [lcto lcto-vec]
        (when (not-empty lcto)
          (insere-lcto-cotacao<! cod enti (first lcto))
          (recur (rest lcto)))))
    (insere-lcto-cotacao<! cod enti lctos)))

然后处理字段的函数insere lcto-cotacao<!

(defn insere-lcto-cotacao<!
  [cod enti lcto]
  (let [lcto_codentidade enti
        lcto_codcontrole cod
        lcto_dtmvto (util/convert-to-data-type (.format (java.text.SimpleDateFormat. "MM/dd/yyyy") (Date.)))
        lcto_codprod (Integer. (:lcco_codprod lcto))
        lcto_qemb (bigdec (:lcco_qemb lcto))
        lcto_qtde (bigdec (:lcco_qtde lcto))
        lcto_fpgto (util/empty-field? (:lcco_fpgto lcto) false)
        lcto_preco (util/empty-field? (:lcco_preco lcto) true)
        lcto_codempresa (util/empty-field? (:lcco_codempresa lcto) false)
        new-lcto (assoc lcto :lcco_codentidade lcto_codentidade
                             :lcco_codcontrole lcto_codcontrole
                             :lcco_dtmvto lcto_dtmvto
                             :lcco_codprod lcto_codprod
                             :lcco_preco lcto_preco
                             :lcco_qemb lcto_qemb
                             :lcco_qtde lcto_qtde
                             :lcco_fpgto lcto_fpgto
                             :lcco_codempresa lcto_codempresa)]
    (insere-lcto-transaction<! (dissoc new-lcto :tpemb :descricao :codbarras :marca))))

最后是insere-lcto-transaction<!和SQL查询

(defn insere-lcto-transaction<!
  [lcto]
  (jdbc/with-db-transaction [tx db-spec]
                            (insert-lcto-cotacao<! lcto {:connection tx})))

-- name: insert-lcto-cotacao<!
INSERT INTO lctocotacao (lcco_codentidade, lcco_codprod, lcco_preco, lcco_dtmvto, lcco_codempresa, lcco_fpgto, lcco_qemb, lcco_qtde, lcco_codcontrole)
VALUES(:lcco_codentidade, :lcco_codprod, :lcco_preco, :lcco_dtmvto, :lcco_codempresa, :lcco_fpgto, :lcco_qemb, :lcco_qtde, :lcco_codcontrole);

嗯,就是这样。奇怪的是,当我lein ring server时,它工作正常,但当我部署到lein ring uberwar时,它无法正常工作。

另外,我尝试在Windows和Debian中使用Tomcat。

有没有人知道为什么会这样?

修改 记录后,我得到了一些结果:

运行本地lein ring server

POST返回var form的内容与我:param中的密钥session的内容相同 同样在session中,我的:form-params内容相同,但不使用:lcco_fpgto之类的键,而是使用“lcco_fpgto”等字符串

{:lcco_fpgto ["001" "001" "001" "001"], 
:tpemb ["CX" "CX" "PT" "CX"], 
:lcco_qtde ["150.00000" "1.00000" "30.00000" "1.00000"], 
:descricao ["Cerveja 350ml Skola" "Adoc 100ml Assugrin Diet" "Cafe 500g Corol Torrado Moido" "Deterg Liq 500ml Alpes Neutro"], 
:lcco_codprod ["19" "28" "64" "123"], 
:lcco_preco ["1.00000" "2.00000" "3.00000" "4.00000"], 
:codbarras ["7896232111149" "7896060010492" "7896184000010" "7896274800124"], 
:lcco_codempresa ["001" "001" "001" "001"], 
:lcco_qemb ["12.00000" "12.00000" "10.00000" "24.00000"], 
:marca ["Skol" "Assugrin" "Corol" "Alpes"], 
:__anti-forgery-token ["Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*" "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*" "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*" "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"]}

运行已部署的应用时:

POST返回与:param内的session键相同(仅限最后一个元素)

{:lcco_fpgto "001", 
:tpemb "CX", 
:lcco_qtde "1.00000", 
:descricao "Deterg Liq 500ml Alpes Neutro",
:lcco_codprod "123", 
:lcco_preco "4", 
:codbarras "7896274800124", 
:lcco_codempresa "001", 
:lcco_qemb "24.00000", 
:marca "Alpes", 
:__anti-forgery-token "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"}   

我发现的是:form-params里面的session包含所有内容,但是使用字符串代替键。

:form-params {
    "lcco_preco" ["1" "2" "3" "4"], 
    "tpemb" ["CX" "CX" "PT" "CX"], 
    "descricao" ["Cerveja 350ml Skola" "Adoc 100ml Assugrin Diet" "Cafe 500g Corol Torrado Moido" "Deterg Liq 500ml Alpes Neutro"],
    "lcco_codprod" ["19" "28" "64" "123"], 
    "lcco_fpgto" ["001" "001" "001" "001"], 
    "codbarras" ["7896232111149" "7896060010492" "7896184000010" "7896274800124"], 
    "marca" ["Skol" "Assugrin" "Corol" "Alpes"], 
    "lcco_qtde" ["150.00000" "1.00000" "30.00000" "1.00000"], 
    "__anti-forgery-token" ["Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*" "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*" "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*" "Unbound: #'ring.middleware.anti-forgery/*anti-forgery-token*"], 
    "lcco_qemb" ["12.00000" "12.00000" "10.00000" "24.00000"], 
    "lcco_codempresa" ["001" "001" "001" "001"]}

那么,为什么会这样呢?使用我在这里得到的var form是错误的吗?

POST "/cotacao/:cod" [cod & form :as session] (lcto-cotacao-page cod form session))

为什么会出现这种差异?

编辑2 我的中间件:

https://codeshare.io/mR7Zh

0 个答案:

没有答案