尝试设置应用程序以在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
鉴于我几乎没有什么例子,我有点在损失的想法做些什么呢。
我很抱歉听到这个例子导致你的问题。这是一个类型转换问题。为了使读取工作,您需要在Jongo内部使用对象映射器注册https://github.com/michel-kraemer/bson4jackson。我不认为你可以得到一个写命令来正常使用泛型类型,因为它会将_id的字符串值而不是实际的ObjectId。我将看到有关添加涵盖Mongo特定类型的示例。 –