2017-02-17 72 views
1

尝试设置应用程序以在Web应用程序(用于业务分析)中显示MongoDB嵌套数据(嵌套和嵌入的两个级别)。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; 
    } 

    } 

} 

我可以卷曲/和将得到的集合回来了,所以我会说,到数据库的连接作品。但是,如果我卷曲的藏品,无论是实际的数据或字母和数字,甚至只是一个空对象(_id只)只是普通KVP哑,我总是得到

com.fasterxml。 jackson.databind.JsonMappingException:org.bson.types.ObjectId不能转换为java.lang.String

鉴于我几乎没有什么例子,我有点在损失的想法做些什么呢。

+0

我很抱歉听到这个例子导致你的问题。这是一个类型转换问题。为了使读取工作,您需要在Jongo内部使用对象映射器注册https://github.com/michel-kraemer/bson4jackson。我不认为你可以得到一个写命令来正常使用泛型类型,因为它会将_id的字符串值而不是实际的ObjectId。我将看到有关添加涵盖Mongo特定类型的示例。 –

回答

0

您是否有POST方法创建数据或者您是否使用现有集合?

您可以看到here在他们的示例中,他们明确将_id视为String而不是ObjectId。我的猜测是为了解决你在这里看到的问题。

Jongo有many ways of mapping an ObjectId,但他们都需要使用自定义POJO并注释id字段,因此它们不会像示例中那样灵活。

如果可能的话,将您的所有_id领域在数据库中是普通字符串,否则你将需要找到某种方式来处理ObjectId类型(打字到POJO或modifying the Jongo Mapper也许)。

祝你好运:)

+0

这是一个现有的集合。由于我在春季做这个尝试的时候取得了更好的进展,我正在追求这个道路,并没有继续使用dropwizard。感谢你的帮助! – cmm

相关问题