2015-09-25 2 views
3

J'essaie de créer un noeud dans mon datastore Neo4j en utilisant des néocons clojure et je rencontre une erreur que je pense être lié à la mise en forme json:Clojure JSON: Exception: com.fasterxml.jackson.core.JsonGenerationException: Impossible d'encoder l'objet de la classe JSON:

Exception: com.fasterxml.jackson.core.JsonGenerationException: Cannot JSON encode object of class: class recursiftion.dao_graph$create_node: [email protected] 
         generate.clj:148 cheshire.generate/generate 
         generate.clj:119 cheshire.generate/generate 
          core.clj:31 cheshire.core/generate-string 
          core.clj:21 cheshire.core/generate-string 
         cypher.clj:51 clojurewerkz.neocons.rest.cypher/query 
         core.clj:2440 clojure.core/comp[fn] 
        dao_graph.clj:428 recursiftion.dao-graph/create-node 
         model.clj:131 recursiftion.model/createNode 
        controller.clj:206 recursiftion.controller/fn 
          core.clj:99 compojure.core/make-route[fn] 
          core.clj:45 compojure.core/if-route[fn] 
          core.clj:30 compojure.core/if-method[fn] 
          core.clj:112 compojure.core/routing[fn] 
         core.clj:2570 clojure.core/some 
          core.clj:112 compojure.core/routing 
         RestFn.java:139 clojure.lang.RestFn.applyTo 
          core.clj:632 clojure.core/apply 
          core.clj:117 compojure.core/routes[fn] 
       keyword_params.clj:32 ring.middleware.keyword-params/wrap-keyword-params[fn] 
... 

Je soupçonne que cela peut être lié à Cheshire basé sur le rapport d'erreur. Mais je suis confus parce que je n'inclue pas la bibliothèque de Cheshire dans le dossier où l'erreur se produit.

J'ai ce que mon emballage parce que je fais CORS POST & requêtes GET et je dois retourner JSON de mon controller.clj

(def app 
(-> (handler/api app-routes) 
(middleware/wrap-json-body {:keywords? true}) 
(middleware/wrap-json-response) 
(wrap-cors routes #"^http://localhost:9000$"))) 

Ci-dessous sont les bibliothèques référencées dans mon controller.clj

(ns recursiftion.controller 
(:use [ring.adapter.jetty :only [run-jetty]] 
[recursiftion.websocket :only [wamp-handler]] 
[recursiftion.config :only [conf]] 
) 
(:require [compojure.core :refer :all] 
[compojure.handler :as handler] 
[compojure.route :as route] 
[clojure.java.io :as io] 
[ring.util.io :refer [string-input-stream]] 
[ring.util.response :as resp] 
[ring.util.response :refer [response]] 
[ring.middleware.json :as middleware] 
[ring.middleware.cors :refer [wrap-cors]] 
[environ.core :refer [env]] 
[cheshire.core :refer :all] 
[recursiftion.model :as model] 
[monger.json] 
[clojure.pprint :refer [pprint]])) 

Voici mon POST code de noeud final dans mon controller.clj

(POST "/node/create" request 
(let [node_object (or (get-in request [:params :data]) 
(get-in request [:body :data]) 
"1ROUTER_ERROR")] 
{:status 200 
:headers {"Content-Type" "application/json"} 
:body (recursiftion.model/createNode node_object) 
} 
)) 

Voici les bibliothèques référencées qui passent à travers mon modèle et se trouvent dans un dao_graph.clj

(ns recursiftion.dao_graph 
(:require [clojure.string] 
[clojurewerkz.neocons.rest :as nr] 
[clojurewerkz.neocons.rest.cypher :as cy] 
[clojure.pprint :refer [pprint]]) 
(:import [org.bson.types.ObjectId]) 
) 

Voici la définition de la fonction qui est invoquée à l'intérieur dao_graph.clj:

(defn create-node [ nodeobj ] 
(let [ _nodeobj nodeobj ] 
(cy/tquery conn create-node { :_nodetype (get-in _nodeobj [:type]) }))) 

Et ici est la requête Cypher qui retourne une carte avec « ... » comme ses clés

(def create-node "CREATE (m:{_nodetype}) 
RETURN M;") 

Je suis très reconnaissant pour votre aide dans la résolution de ce problème.

+0

Vous aurez besoin de faire un exemple plus minimal pour que les gens puissent vous aider efficacement. –

+0

ce post a déjà reçu quelques upvotes donc il semble qu'il y a d'autres personnes là-bas qui ont aussi le même type de problème. Si j'ajoute une prime à cette question, pouvez-vous m'aider? –

+1

La seule façon que je peux efficacement aider est si vous créez un exemple d'échec minimal que je peux exécuter. Idéalement, ce serait à la fois ici, et dans un dépôt open source quelque part que je peux cloner et exécuter. Une prime serait bien, mais j'ai besoin de plus d'informations aussi :) –

Répondre

1

Pas vraiment assez d'informations. Cependant, cette exception est souvent constatée lorsque cheshire ne reconnaît pas le type de données de quelque chose qu'on lui a dit d'encoder comme json. L'erreur semble que vous essayez d'encoder une fonction json plutôt que de sortir d'une fonction? J'ajouterais un println dans votre endpoint et j'imprimerais ce que vous pensez être retourné. Si la sortie ressemble à un objet fonction plutôt qu'à quelque chose que json peut encoder, c'est probablement la cause. Quant à l'endroit où cela se produit, je suppose que votre middleware essaie d'encoder le corps de la réponse en tant que json.