Преобразование из документа Couchbase в POJO с использованием Spring-data-couchbase - PullRequest
0 голосов
/ 25 апреля 2019

Мне нужно прочитать документ couchbase и преобразовать его в простой объект класса pojo.Из документов я понимаю, что мне нужно определить какой-то пользовательский конвертер для преобразования этого документа в объект POJO, поскольку он имеет (не примитивное) поле типа org.apache.commons.json.JSONObject, как показано ниже

@Document
public class MyClass{

    @Id
    private String id;

    @Field
    private JSONObject someJsonObj;
//getters and setters

}

ниже - хранилище для этого

@Repository
@N1qlPrimaryIndexed
public interface MyClassRepository extends CouchbaseRepository<MyClass, String>{}

при сохранении объекта, код ниже работает нормально,

     MyClass myclass = new MyClass();
     myclass.setId(someKey);
    myclass.setSomeJsonObj(jsonObject);
    myclassRepository.save(myclass);

и сохраняет документ в формате ниже в couchbase

someKey {jsonObject}

теперь во время поиска я использую пользовательский конвертер чтения, как показано ниже

@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!.Ниже приведена полная трассировка стека

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 во время поиска.

1 Ответ

1 голос
/ 25 апреля 2019

Если вы используете Spring Data, вам не нужно писать никаких пользовательских конвертеров, сам репозиторий может возвращать POJO:

@Document
@Data
@AllArgsConstructor
public class Area extends BasicEntity {

    @NotNull
    @Id
    private String id;

    @NotNull
    private String name;

    private String description;

    private String parentAreaId;

}

А потом, в вашем хранилище:

@N1qlPrimaryIndexed
public interface AreaRepository extends CouchbaseRepository<Area, String> {

    List<Area> findByParentAreaId(String parentAreaId);
}

Пользовательские преобразователи могут быть определены только в том случае, если сохраняемый вами объект не является POJO, как JODA или классы, связанные с датой Java 8.

...