杰克逊无法反序列化对象的MongoDB通过REST传递(Jackson can't dese

2019-09-27 02:35发布

试图建立一个应用程序来显示MongoDB的嵌套的数据(两个嵌套层次和嵌入)在Web应用程序(业务分析)。

我使用Dropwizard,所以我复制了dropwizard -蒙戈 例如 ,它减少到必要的部分(不删除,没有插入,没有指标或任何东西)。

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

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

Answer 1:

你有一个POST ,你使用现有的收集方法创建数据或?

你可以看到这里 ,在他们的榜样,他们都明确地治疗_id作为一个String ,而不是一个ObjectId 。 我的猜测是,这是要解决你在这里看到的非常问题。

Jongo具有映射的许多方法ObjectId ,但它们都使用自定义POJO并注释需要id字段,以便他们不会如示出的例子为柔性的。

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

祝好运 :)



文章来源: Jackson can't deserialize MongoDB object passed through REST