【问题标题】:How to upsert JSONArray sub document in couchbase如何在沙发库中插入 JSONArray 子文档
【发布时间】:2018-10-20 10:24:35
【问题描述】:

我正在尝试将 JSONArray 和其他一些字段插入到 couchbase 中的现有 json 文档中,但在调用 couchbase 时出现错误。 请帮忙!

在这里,我将 JSONArray 设置为 JsonBody,然后将其设置为 Exchange 的主体(见下文)

    JSONArray smsRequestArray = new JSONArray();
    for(String camelSmppId : camelSmppIdList) {
        JSONObject obj = new JSONObject();
        obj.put("smsRequestId", camelSmppId);
        obj.put("status", "InProgress");
        smsRequestArray.put(obj);
    }

jsonBody.put("smsRequest", smsRequestArray);
exchange.getIn().setBody(jsonBody.toString());

现在,我想用这个 json 数组更新 Couchbase 文档

JSONArray updateObj = new JSONArray();
JSONObject smsRequest = new JSONObject();
smsRequest.put(VALUE, (JSONArray) jsonBody.get("smsRequest"));
smsRequest.put(KEY, "smsRequest");
updateObj.put(smsRequest);

但是,当调用下面的代码来更新 couchbase 上的文档时,我得到一个错误。

operationObj.put("upsert", updateObj);

JSONObject cbMutateDocument = new JSONObject();       

cbMutateDocument.put("operations", operationObj);

newExchange.setProperty(BODY_PARAMETERS, cbMutateDocument.toString());

RouteHelper.sendRequest(getProducerTemplate(exchange), "cbservice://mutate?key="+keyId+"&bucket=notification", newExchange);

请告诉我这里出了什么问题。

错误:

2018-10-19 02:57:47,674 | ERROR | nsumer[smsQueue] | CBConnectorEndPointProcessor     |  |  |  |  |  |  |  |  | 383 - bil-cbconnector - 1.0.0.SNAPSHOT | Exception processing request :

com.couchbase.client.java.error.TranscodingException: Couldn't encode MutationSpec #1 (DICT_UPSERT on smsRequest) in 130f0781-925f-461d-8fe5-e53f1ca032c9

                at com.couchbase.client.java.transcoder.subdoc.AbstractByteArrayFragmentTranscoder.doEncodeSingle(AbstractByteArrayFragmentTranscoder.java:65)

                at com.couchbase.client.java.transcoder.subdoc.AbstractFragmentTranscoder.encodeWithMessage(AbstractFragmentTranscoder.java:50)

                at com.couchbase.client.java.subdoc.AsyncMutateInBuilder$2.call(AsyncMutateInBuilder.java:1245)

                at com.couchbase.client.java.subdoc.AsyncMutateInBuilder$2.call(AsyncMutateInBuilder.java:1232)

                at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)

                at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)

                at rx.Observable.unsafeSubscribe(Observable.java:10327)

                at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48)

                at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33)

                at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)

                at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)

                at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)

                at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)

                at rx.Observable.subscribe(Observable.java:10423)

                at rx.Observable.subscribe(Observable.java:10390)

                at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:443)

                at rx.observables.BlockingObservable.single(BlockingObservable.java:340)

                at com.couchbase.client.java.subdoc.MutateInBuilder.execute(MutateInBuilder.java:280)

                at com.couchbase.client.java.subdoc.MutateInBuilder.execute(MutateInBuilder.java:103)

                at com.amdocs.cb.component.CBConnectorEndPointProcessor.processRequest(CBConnectorEndPointProcessor.java:441)

                at com.amdocs.cb.component.CBConnectorEndPointProcessor.process(CBConnectorEndPointProcessor.java:244)

                at org.apache.camel.impl.ProcessorEndpoint.onExchange(ProcessorEndpoint.java:103)

                at org.apache.camel.impl.ProcessorEndpoint$1.process(ProcessorEndpoint.java:71)

                at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:68)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:412)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:380)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:270)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:380)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:205)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:119)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:105)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at com.amdocs.bl.common.util.RouteHelper.sendRequest(RouteHelper.java:35)

                at com.amdocs.bil.notificationdispatcher.NotificationDispatchPostProcessor.process(NotificationDispatchPostProcessor.java:207)[398:bil-notification-dispatcher:1.0.0.SNAPSHOT]

                at com.amdocs.bil.notificationdispatcher.processors.MessageProcessor.processMessage(MessageProcessor.java:81)[398:bil-notification-dispatcher:1.0.0.SNAPSHOT]

                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.8.0_66]

                at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[:1.8.0_66]

                at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.8.0_66]

                at java.lang.reflect.Method.invoke(Method.java:497)[:1.8.0_66]

                at org.apache.camel.component.bean.MethodInfo.invoke(MethodInfo.java:408)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.component.bean.MethodInfo$1.doProceed(MethodInfo.java:279)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.component.bean.MethodInfo$1.proceed(MethodInfo.java:252)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.component.bean.BeanProcessor.process(BeanProcessor.java:177)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:468)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.Throttler.process(Throttler.java:164)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:468)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.component.directvm.DirectVmProcessor.process(DirectVmProcessor.java:55)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.component.directvm.DirectVmProducer.process(DirectVmProducer.java:63)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.processor.UnitOfWorkProducer.process(UnitOfWorkProducer.java:68)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:412)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache$2.doInProducer(ProducerCache.java:380)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache.doInProducer(ProducerCache.java:270)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache.sendExchange(ProducerCache.java:380)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.ProducerCache.send(ProducerCache.java:205)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:119)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.impl.DefaultProducerTemplate.send(DefaultProducerTemplate.java:105)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at com.amdocs.bil.notificationdispatcher.processors.MessageProcessor.process(MessageProcessor.java:58)[398:bil-notification-dispatcher:1.0.0.SNAPSHOT]

                at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.processNext(AsyncProcessorConverterHelper.java:87)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:82)[231:org.apache.camel.camel-core:2.17.0.redhat-630329]

                at org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:112)[243:org.apache.camel.camel-jms:2.17.0.redhat-630329]

                at org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:555)[242:org.apache.servicemix.bundles.spring-jms:3.2.18.RELEASE_1]

                at org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:515)[242:org.apache.servicemix.bundles.spring-jms:3.2.18.RELEASE_1]

                at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:485)[242:org.apache.servicemix.bundles.spring-jms:3.2.18.RELEASE_1]

                at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325)[242:org.apache.servicemix.bundles.spring-jms:3.2.18.RELEASE_1]

                at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263)[242:org.apache.servicemix.bundles.spring-jms:3.2.18.RELEASE_1]

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1103)[242:org.apache.servicemix.bundles.spring-jms:3.2.18.RELEASE_1]

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1095)[242:org.apache.servicemix.bundles.spring-jms:3.2.18.RELEASE_1]

                at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:992)[242:org.apache.servicemix.bundles.spring-jms:3.2.18.RELEASE_1]

                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_66]

                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_66]

                at java.lang.Thread.run(Thread.java:745)[:1.8.0_66]

Caused by: com.couchbase.client.deps.com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.codehaus.jettison.json.JSONArray and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) )

                at com.couchbase.client.deps.com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)

                at com.couchbase.client.deps.com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:68)

                at com.couchbase.client.deps.com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32)

                at com.couchbase.client.deps.com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130)

                at com.couchbase.client.deps.com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3631)

                at com.couchbase.client.deps.com.fasterxml.jackson.databind.ObjectMapper.writeValueAsBytes(ObjectMapper.java:3022)

                at com.couchbase.client.java.transcoder.subdoc.JacksonFragmentTranscoder.writeValueAsBytes(JacksonFragmentTranscoder.java:80)

                at com.couchbase.client.java.transcoder.subdoc.AbstractByteArrayFragmentTranscoder.doEncodeSingle(AbstractByteArrayFragmentTranscoder.java:63)

                ... 83 more

【问题讨论】:

    标签: java apache-camel couchbase n1ql


    【解决方案1】:

    Couchbase Java 类型被命名为 JsonDocument、JsonArray 和 JsonObject,而不是 JSONDocument、JSONArray 和 JSONObject。看来您可能误用了另一个 JSON 库?

    【讨论】:

    • 实际上,JSONObject 有效。我可以更新 Couchbase 中 JSONObject 内的字符串键、值对。只是我在插入 JSONArray 时遇到了问题
    • @Bhuvan 这很奇怪,我不希望它起作用(对于上下文,我是一名从事 Java SDK 的 Couchbase 开发人员)。你能给我看一段演示代码的sn-p吗?
    • 我找到了解决方案。过段时间会发的。
    【解决方案2】:

    我找到了解决办法。

    在创建文档时,我必须在 Couchbase 文档中创建一个空数组。只有这样,该数组才能通过使用“arrayAppend”操作进行变异。

    创建时

    JSONObject cbDocument = new JSONObject(messageBody);
    cbDocument.put("smsRequest", new JSONArray());
    exchange.setProperty("bodyParameters", cbDocument.toString());
    RouteHelper.sendRequest(producerTemplate, "cbservice://create?bucket=notification", exchange);
    

    更新时

    List<JSONObject> operations = new ArrayList<JSONObject>();
    
    JSONArray smsRequestArray = (JSONArray)jsonBody.get("smsRequest");
                    for(int i=0; i<smsRequestArray.length(); i++) {
                        JSONArray arrayAppendOperationArray = new JSONArray();
                        JSONObject smsArrayAppendOperationObject = new JSONObject();
    
                        JSONObject smsRequest = new JSONObject();
                        smsRequest.put(VALUE, smsRequestArray.optJSONObject(i));
                        smsRequest.put(KEY, "smsRequest");
                        arrayAppendOperationArray.put(smsRequest);
                        smsArrayAppendOperationObject.put("arrayAppend", arrayAppendOperationArray);
                        operations.add(smsArrayAppendOperationObject);
                    }
    
    JSONObject cbMutateDocument = new JSONObject();
    
        for(int i=0; i < operations.size(); i++) {
                            cbMutateDocument.put("operations", operations.get(i));
                            newExchange.setProperty(BODY_PARAMETERS, cbMutateDocument.toString());  
                            RouteHelper.sendRequest(getProducerTemplate(exchange), "cbservice://mutate?key="+keyId+"&bucket=notification", newExchange);
                        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 2020-06-17
      • 2014-12-20
      • 2016-12-14
      相关资源
      最近更新 更多