Jackson无法反序列化通过REST传递的MongoDB对象

时间:2017-02-17 14:17:55

标签: java mongodb rest jackson dropwizard

尝试设置应用程序以在Web应用程序中显示MongoDB嵌套数据(嵌套和嵌入的两个级别)(用于业务分析)。

我使用Dropwizard,因此我复制了dropwizard-mongo example,将其缩减为必要部分(无删除,无插入,无指标或任何内容)。

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;
    }

  }

}

我可以卷曲到/并且会返回收集的集合,所以我会说与数据库的连接有效。但是,如果我卷曲任何集合,无论是实际数据还是只有普通KVP字母和数字的虚拟对象,甚至只是一个空对象(仅限_id),我总是得到

  

com.fasterxml.jackson.databind.JsonMappingException:org.bson.types.ObjectId无法强制转换为java.lang.String

鉴于我几乎没有对这个例子采取任何措施,我有点想知道如何处理这个问题。

1 个答案:

答案 0 :(得分:0)

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

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

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

如果可能,将数据库中的所有_id字段转换为纯字符串,否则您需要找到一些处理ObjectId类型的字段(输入到POJO或{{或许)。

祝你好运:)