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