2017-02-17 14 views
1

WebアプリケーションにMongoDBネストされたデータ(ネストと埋め込みの2つのレベル)を表示するアプリケーションを設定しようとしました。JacksonはRESTを通過したMongoDBオブジェクトを逆シリアル化できません

私はDropwizardを使用していますので、dropwizard-mongoexampleをコピーして、必要な部分に減らしました(削除なし、挿入なし、メトリックなしなど)。

App.java

package test; 


import io.dropwizard.Application; 
import io.dropwizard.setup.Bootstrap; 
import io.dropwizard.setup.Environment; 

import com.meltmedia.dropwizard.mongo.MongoBundle; 
import test.Res; 

public class App extends Application<Config> { 
    public static void main(String[] args) throws Exception { 
    new App().run(args); 
    } 

    MongoBundle<Config> mongoBundle; 

    @Override 
    public void initialize(Bootstrap<Config> bootstrap) { 
    bootstrap.addBundle(mongoBundle = 
     MongoBundle.<Config> builder() 
      .withConfiguration(Config::getMongo).build()); 
    } 

    @Override 
    public void run(Config config, Environment env) throws Exception { 
    env.jersey().register(new Res(mongoBundle.getDB())); 
    } 


} 

Res.java(リソースクラス)

package test; 

import java.util.List; 
import java.util.Set; 


import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.Response.Status; 

import org.jongo.Jongo; 
import org.jongo.MongoCollection; 

import com.fasterxml.jackson.databind.node.ObjectNode; 
import com.mongodb.DB; 

@Path("/") 
public class Res { 

    DB database; 
    Jongo jongo; 

    public Res(DB database) { 
    this.database = database; 
    this.jongo = new Jongo(database); 
    } 

    @GET 
    @Produces("application/json") 
    public Set<String> collectionNames() { 
    return database.getCollectionNames(); 
    } 

    @Path("{collectionName}") 
    public CollectionResource collection(@PathParam("collectionName") String name) { 
    return new CollectionResource(jongo.getCollection(name)); 
    } 

    public class CollectionResource { 

    MongoCollection collection; 

    public CollectionResource(MongoCollection collection) { 
     this.collection = collection; 
    } 

    @GET 
    @Produces("application/json") 
    public List<String> list() { 
     return collection.distinct("_id").as(String.class); 
    } 

    @GET 
    @Path("{id}") 
    @Produces("application/json") 
    public ObjectNode getDocument(@PathParam("id") String id) { 
     ObjectNode node = collection.findOne("{_id: #}", id).as(ObjectNode.class); 
     if (node == null) { 
     throw new WebApplicationException(Response.status(Status.NOT_FOUND).build()); 
     } 
     return node; 
    } 

    } 

} 

私はにカールすることができます/とコレクションが返されますので、私は、DBへの接続を言いますよ働く私はコレクションのいずれかをカールしかし、もし、その実際のデータまたは文字と数字あるいは単に空のオブジェクトの単なるKVPダミーなる(_idのみ)、私はいつも

com.fasterxmlを取得します。 jackson.databind.JsonMappingException:org.bson.types.ObjectIdは、私はほとんどの例には、何もなかった考えるjava.lang.Stringで

にキャストすることはできません、私はアイデアのために途方に暮れてややよ、このことについて何をすべきか。

+0

この例では問題が発生していることを申し訳ありません。これは型変換の問題です。読み込みを有効にするには、Jongo内のオブジェクトマッパーでhttps://github.com/michel-kraemer/bson4jacksonを登録する必要があります。実際のObjectIdの代わりに_idのString値を設定するので、ジェネリック型を使用して正しく動作するように書き込みコマンドを取得できるとは思いません。モンゴー固有のタイプを扱う例を追加することになるでしょう。 –

答えて

0

データの作成方法がPOSTか、既存のコレクションを使用していますか?

hereの例では、_idStringと明示的に扱い、ObjectIdではないことがわかります。私の推測では、あなたがここで見ている問題を回避することでした。

Jongoはmany ways of mapping an ObjectIdを持っていますが、カスタムPOJOを使用してidフィールドに注釈を付けることが必要なので、表示されている例ほど柔軟ではありません。

可能な場合は、そうでなければ、ObjectIdタイプ(いずれかのタイピングにPOJOまたは多分modifying the Jongo Mapperに)に対処するために何らかの方法を見つける必要があります、プレーンな文字列であるために、データベース内のすべてのあなたの_idのフィールドを変換します。

幸運にも:)

+0

これは既存のコレクションです。私が春にこれをやろうとする私の試みでは、より良い進歩を遂げて以来、私はその道を追求しており、dropwizardで続行していません。あなたの助けに感謝! – cmm

関連する問題