2017-04-16 8 views
1

에서 스키마를지도로?은 다음 Clojure의

이유는 HTTP 서비스가 맵을 수신하여 자동으로 스키마를 적용하기 때문에 계정 만 사용하는 경우 맵이 계정 유형이 아니기 때문에 실패합니다.

나는 같이 설명에서 추출하는 시도 :

(schema.core/explain Account) 

하지만 내가 얻을 정말 스키마되지 않습니다 : 당신이 경우,

{:id Uuid, 
:short-id Str, 
:name Str, 
:created-at Inst} 

값 대신 클래스의 상징은, 그래서 그것을 사용하려고 :

(schema.core/validate (last (schema.core/explain server.models.account.Account)) {}) 

당신이 얻을이 오류 :

0123을
IllegalArgumentException No implementation of method: :spec of protocol: #'schema.core/Schema found for class: clojure.lang.Symbol clojure.core/-cache-protocol-fn (core_deftype.clj:568) 
+0

, 또는 어떻게 구축하기 지도에 해당하는 스키마? – fl00r

+0

@ fl00r 레코드에서 추출하는 방법을 수동으로 다시 만들 필요가 없습니다. 나는 그 질문을 수정할 것이다. – Pablo

답변

0

당신이 사용할 수있는 내장 explain 기능 :

(last (schema.core/explain Account)) 
{:id Uuid, :short-id Str, :name Str, :created-at Inst} 

또는 좀 더 까다로운 spec 당신은 기록의 정의에서이 스키마를 추출하는 방법을 요구하고있다

(-> (schema.core/spec Account) 
    :options 
    first 
    :schema 
    last 
    last) 
{:id java.util.UUID, :short-id java.lang.String, :name java.lang.String, :created-at java.util.Date} 
+0

첫 번째 스키마가 유효하지 않습니다. Str에는 schema.core/Str 대신에 심볼이 있습니다. 즉 클래스입니다. – Pablo

+0

사양에서 가져 오는 솔루션이 작동하는 것처럼 보이지만 사실은 복잡한 것입니다. – Pablo