2017-02-17 15 views
1

Попытка настроить приложение для отображения вложенных данных MongoDB (два уровня вложенности и встраивания) в веб-приложение (для бизнес-анализа).Джексон не может десериализовать объект MongoDB, прошедший через REST

Я использую Dropwizard, поэтому я скопировал 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

Учитывая я почти ничего к примеру, я несколько при потере идеи, что делать об этом ,

+0

Извините, что этот пример вызывает у вас проблемы. Это проблема преобразования типов. Чтобы заставить читать работу, вам нужно будет зарегистрировать https://github.com/michel-kraemer/bson4jackson с помощью объекта mapper внутри Jongo. Я не думаю, что вы могли бы написать команду записи для правильной работы с использованием общих типов, так как она помещала бы значения String для _id, а не фактические ObjectIds. Я расскажу о добавлении примера, который охватывает специфические типы 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

Смежные вопросы