首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring-data-couchbase将Couchbase文档转换为POJO

使用Spring-data-couchbase将Couchbase文档转换为POJO
EN

Stack Overflow用户
提问于 2019-04-25 17:39:16
回答 1查看 917关注 0票数 0

我需要读取couchbase文档并将其转换为一个简单的pojo类对象。从docs中,我知道我需要定义一些自定义转换器来将文档转换为POJO对象,因为它有一个org.apache.commons.json.JSONObject类型的(非原语)字段,如下所示

代码语言:javascript
复制
@Document
public class MyClass{

    @Id
    private String id;

    @Field
    private JSONObject someJsonObj;
//getters and setters

}

下面是这个的存储库

代码语言:javascript
复制
@Repository
@N1qlPrimaryIndexed
public interface MyClassRepository extends CouchbaseRepository<MyClass, String>{}

在保存对象时,下面的代码运行良好,

代码语言:javascript
复制
     MyClass myclass = new MyClass();
     myclass.setId(someKey);
    myclass.setSomeJsonObj(jsonObject);
    myclassRepository.save(myclass);

并将文档保存为couchbase中的以下格式

代码语言:javascript
复制
someKey {jsonObject}

现在,在检索过程中,我使用了一个自定义的读取转换器,如下所示

代码语言:javascript
复制
@ReadingConverter
    public static enum CouchbaseDocumentToMyClassConverter implements Converter<CouchbaseDocument,MyClass> {
        INSTANCE;
        @Override
        public MyClass convert(CouchbaseDocument source) {
            System.out.println(source.getPayload()); //this is returning lot of unwanted data like id, exp and payload for every nested json Object 
            //logic to instantiate MyClass obj 
            return new MyClass();
            }
        }

如果我尝试将对象直接映射到MyClass对象,而不是在转换中映射到CouchbaseDocument,那么我得到的是org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type java.lang.Object!。下面是完整的堆栈跟踪

代码语言:javascript
复制
2019-04-25 15:01:36.584 ERROR [{}] 33024 --- [http-nio-8080-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type java.lang.Object!] with root cause
rx.exceptions.OnErrorThrowable$OnNextValue: OnError while emitting onNext value: com.couchbase.client.java.document.RawJsonDocument.class
    at rx.exceptions.OnErrorThrowable.addValueAsLastCause(OnErrorThrowable.java:118) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.operators.OnSubscribeMap$MapSubscriber.onNext(OnSubscribeMap.java:73) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.util.ScalarSynchronousObservable$WeakSingleProducer.request(ScalarSynchronousObservable.java:276) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.Subscriber.setProducer(Subscriber.java:211) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.operators.OnSubscribeMap$MapSubscriber.setProducer(OnSubscribeMap.java:102) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:138) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.util.ScalarSynchronousObservable$JustOnSubscribe.call(ScalarSynchronousObservable.java:129) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.Observable.unsafeSubscribe(Observable.java:10327) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) ~[rxjava-1.3.8.jar:1.3.8]
    at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) ~[rxjava-1.3.8.jar:1.3.8]

有人能提供一些关于如何解决这个问题的见解吗?在检索期间,我直接希望将couchbase文档映射到我的POJO类对象。

EN

回答 1

Stack Overflow用户

发布于 2019-04-25 17:45:52

如果您使用的是Spring Data,则不需要编写任何自定义转换器,存储库本身可以返回一个POJO:

代码语言:javascript
复制
@Document
@Data
@AllArgsConstructor
public class Area extends BasicEntity {

    @NotNull
    @Id
    private String id;

    @NotNull
    private String name;

    private String description;

    private String parentAreaId;

}

然后,在您的存储库中:

代码语言:javascript
复制
@N1qlPrimaryIndexed
public interface AreaRepository extends CouchbaseRepository<Area, String> {

    List<Area> findByParentAreaId(String parentAreaId);
}

只有当您存储的对象不是POJO时,才能定义自定义转换器,比如JODA或Java 8与日期相关的类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55846212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档