如何在compojure.api.sweet中实现自定义的强制转换?

后端开发 2026-07-11

我正在使用compojure.api.sweet实现一个端点:

(defroutes http-routes
  (context "/shifts" []
    (POST "/" []
      :body [doc Shift]
      (create-shift doc))))

Shift是一个模式(schema):

(defschema Shift
  {:start Datetime
   :end   Datetime
   (s/optional-key :breaks) [{:start Datetime
                              :end   Datetime}]})

Datetime是一个传入的字符串,我想把它转换为java.time.ZonedDateTime对象。据说可以使用coercion来实现,但在文档中我还没弄清楚如何操作。欢迎提出建议。

解决方案

下面给出一种解决方案:

(ns your.namespace
  (:require
   [schema.core :refer [Schema]]
   [schema.spec.core :refer [CoreSpec]]
   [schema.utils :refer [->ErrorContainer]])
  (:import [java.time ZonedDateTime]
           [java.time.format DateTimeParseException]))

(deftype DatetimeCoreSpec []
  CoreSpec
  (subschemas [_]
    [])

  (checker [_ _]
    (fn [v]
      (try
        (ZonedDateTime/parse v)
        (catch DateTimeParseException _e
          (->ErrorContainer v))))))

(def DatetimeSpec (->DatetimeCoreSpec))

(deftype DatetimeSchema []
  Schema
  (spec [_]
    DatetimeSpec)

  (explain [_]
    'Datetime))

(def Datetime (->DatetimeSchema))
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章