2017-02-17 1 views
1

웹 응용 프로그램에 비즈니스 분석을 위해 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; 
    } 

    } 

} 

내가 말리기 수 /과 컬렉션을 반환 얻을 것이다, 그래서는 DB에 대한 연결을 말할 것이다 공장. 내가 컬렉션 중 하나를 곱슬 곱슬 경우, 그것을 실제 데이터 또는 문자와 숫자 또는 단지 빈 객체 (_id 만)의 그냥 일반 KVP와 더미 될, 난 항상

com.fasterxml를 얻을. jackson.databind.JsonMappingException : org.bson.types.ObjectId은 java.lang.String의

캐스트 할 수없는
나는 거의 예를 아무것도하지 않았다 감안할 때, 나는 이것에 대해 할 수있는 어떤 아이디어 손실에 다소 해요

.

+0

예를 들어 문제를 일으킨 것은 유감입니다. 이것은 유형 변환 문제입니다. 읽기 작업을하려면 Jongo 내부의 객체 매퍼에 https://github.com/michel-kraemer/bson4jackson을 등록해야합니다. 나는 당신이 실제로 ObjectIds 대신에 _id에 String 값을 넣을 것이므로 generic 형식을 사용하여 쓰기 명령을 제대로 수행 할 수 없다고 생각합니다. Mongo 특정 유형을 다루는 예제를 추가하는 방법에 대해 알아 보겠습니다. –

답변

0

데이터를 만드는 방법이 있습니까? 아니면 기존 컬렉션을 사용하고 있습니까?

here은 예제에서 _idString으로 명시 적으로 처리하지만 ObjectId이 아니라는 것을 알 수 있습니다. 내 생각 엔 당신이 여기서보고있는 바로 그 문제를 해결하는 것입니다.

종고는 many ways of mapping an ObjectId이지만 사용자 정의 POJO를 사용하고 id 필드에 주석을 달아서 그림과 같이 유연하지는 않아요.

이 가능하면, 그렇지 않으면 당신은 (A POJO 또는 modifying the Jongo Mapper 아마로에 하나 입력)를 ObjectId 유형에 대처하기 위해 어떻게든지 찾아야합니다, 일반 문자열로 데이터베이스에 모든 _id 필드를 변환합니다.

행운을 빌어 요.

+0

기존 컬렉션입니다. 봄에이 일을 시도하면서 더 나은 진전을 이뤘으므로 나는 그 길을 추구하고 있으며 dropwizard로 계속하지 않았다. 당신의 도움을 주셔서 감사합니다! – cmm

관련 문제