2

I'm using Rhino (https://github.com/mozilla/rhino) 1.67R via Apache Camel and am trying to evaluate the following JSON:

{
  "coord": {
    "lon": -4.75,
    "lat": 54.08
  },
  "weather": [
    {
      "id": 801,
      "main": "Clouds",
      "description": "few clouds",
      "icon": "02d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 17,
    "pressure": 1024,
    "humidity": 77,
    "temp_min": 17,
    "temp_max": 17
  },
  "visibility": 10000,
  "wind": {
    "speed": 4.6,
    "deg": 80
  },
  "clouds": {
    "all": 20
  },
  "dt": 1435922400,
  "sys": {
    "type": 1,
    "id": 5103,
    "message": 0.0888,
    "country": "IM",
    "sunrise": 1435895550,
    "sunset": 1435956814
  },
  "id": 3042196,
  "name": "Port Erin",
  "cod": 200
}

The call to exchange.getIn().getBody() below returns the JSON above (I know this because request.setBody(exchange.getIn().getBody()) sets the body of the response to the JSON above):

var resp = eval (exchange.getIn().getBody());
var temp = resp['name'];

So, all I'm trying to do here is evalute the JSON, and grab a value ('name') from it. However, it is failing with the following error:

var temp = resp['name'];
request.setBody(temp);. Cause: org.mozilla.javascript.EvaluatorException: Java class "[B" has no public instance field or method named "name". (<Unknown Source>#2)
org.apache.camel.builder.script.ScriptEvaluationException: Failed to evaluate: js: var resp = eval (exchange.getIn().getBody());
var temp = resp['name'];
request.setBody(temp);. Cause: org.mozilla.javascript.EvaluatorException: Java class "[B" has no public instance field or method named "name". (<Unknown Source>#2)
    at org.apache.camel.builder.script.ScriptBuilder.createScriptEvaluationException(ScriptBuilder.java:420)[270:org.apache.camel.camel-script:2.10.0.redhat-60065]
    at org.apache.camel.builder.script.ScriptBuilder.evaluateScript(ScriptBuilder.java:347)[270:org.apache.camel.camel-script:2.10.0.redhat-60065]
    at org.apache.camel.builder.script.ScriptBuilder.evaluate(ScriptBuilder.java:91)[270:org.apache.camel.camel-script:2.10.0.redhat-60065]
    at org.apache.camel.builder.script.ScriptBuilder.evaluate(ScriptBuilder.java:95)[270:org.apache.camel.camel-script:2.10.0.redhat-60065]
    at org.apache.camel.builder.ProcessorBuilder$4.process(ProcessorBuilder.java:96)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:73)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.interceptor.TraceInterceptor.process(TraceInterceptor.java:91)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.fabric.FabricTraceProcessor.process(FabricTraceProcessor.java:81)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.processNext(DelegateAsyncProcessor.java:99)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.RedeliveryErrorHandler.processErrorHandler(RedeliveryErrorHandler.java:334)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:220)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.interceptor.StreamCachingInterceptor.process(StreamCachingInterceptor.java:52)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.RouteContextProcessor.processNext(RouteContextProcessor.java:46)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:90)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.interceptor.DefaultChannel.process(DefaultChannel.java:308)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:73)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:117)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.Pipeline.access$100(Pipeline.java:43)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.Pipeline$1.done(Pipeline.java:135)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.impl.MDCUnitOfWork$MDCCallback.done(MDCUnitOfWork.java:236)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.RouteContextProcessor$1.done(RouteContextProcessor.java:56)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.RedeliveryErrorHandler$1.done(RedeliveryErrorHandler.java:346)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.impl.MDCUnitOfWork$MDCCallback.done(MDCUnitOfWork.java:236)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.impl.MDCUnitOfWork$MDCCallback.done(MDCUnitOfWork.java:236)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.impl.MDCUnitOfWork$MDCCallback.done(MDCUnitOfWork.java:236)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.impl.MDCUnitOfWork$MDCCallback.done(MDCUnitOfWork.java:236)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.management.InstrumentationProcessor$1.done(InstrumentationProcessor.java:82)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.impl.MDCUnitOfWork$MDCCallback.done(MDCUnitOfWork.java:236)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.impl.ProducerCache$1.done(ProducerCache.java:321)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.processor.SendProcessor$2$1.done(SendProcessor.java:127)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.impl.MDCUnitOfWork$MDCCallback.done(MDCUnitOfWork.java:236)[272:org.apache.camel.camel-core:2.10.0.redhat-60077]
    at org.apache.camel.component.jetty.JettyContentExchange.doTaskCompleted(JettyContentExchange.java:207)[368:org.apache.camel.camel-jetty:2.10.0.redhat-60065]
    at org.apache.camel.component.jetty.JettyContentExchange.onResponseComplete(JettyContentExchange.java:108)[368:org.apache.camel.camel-jetty:2.10.0.redhat-60065]
    at org.eclipse.jetty.client.HttpExchange$Listener.onResponseComplete(HttpExchange.java:1158)[100:org.eclipse.jetty.client:7.6.7.v20120910]
    at org.eclipse.jetty.client.HttpExchange.setStatus(HttpExchange.java:305)[100:org.eclipse.jetty.client:7.6.7.v20120910]
    at org.eclipse.jetty.client.AbstractHttpConnection$Handler.messageComplete(AbstractHttpConnection.java:337)[100:org.eclipse.jetty.client:7.6.7.v20120910]
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:895)[96:org.eclipse.jetty.http:7.6.7.v20120910]
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)[96:org.eclipse.jetty.http:7.6.7.v20120910]
    at org.eclipse.jetty.client.AsyncHttpConnection.handle(AsyncHttpConnection.java:133)[100:org.eclipse.jetty.client:7.6.7.v20120910]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627)[98:org.eclipse.jetty.io:7.6.7.v20120910]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51)[98:org.eclipse.jetty.io:7.6.7.v20120910]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)[107:org.eclipse.jetty.util:7.6.7.v20120910]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)[107:org.eclipse.jetty.util:7.6.7.v20120910]
    at java.lang.Thread.run(Thread.java:745)[:1.7.0_72]
Caused by: org.mozilla.javascript.EvaluatorException: Java class "[B" has no public instance field or method named "name". (<Unknown Source>#2)
    at org.mozilla.javascript.DefaultErrorReporter.runtimeError(DefaultErrorReporter.java:109)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.Context.reportRuntimeError(Context.java:938)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.Context.reportRuntimeError(Context.java:994)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.Context.reportRuntimeError2(Context.java:964)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.NativeJavaArray.get(NativeJavaArray.java:103)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.ScriptableObject.getProperty(ScriptableObject.java:1617)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.ScriptRuntime.getObjectElem(ScriptRuntime.java:1390)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.ScriptRuntime.getObjectElem(ScriptRuntime.java:1372)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.gen.c102._c0(<Unknown Source>:2)[mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.rhino/1.7R2_3:]
    at org.mozilla.javascript.gen.c102.call(<Unknown Source>)[mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.rhino/1.7R2_3:]
    at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)[407:org.apache.servicemix.bundles.rhino:1.0.0.7R2_3]
    at org.mozilla.javascript.gen.c102.call(<Unknown Source>)[mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.rhino/1.7R2_3:]
    at org.mozilla.javascript.gen.c102.exec(<Unknown Source>)[mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.rhino/1.7R2_3:]
    at com.google.code.scriptengines.js.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:64)[268:scriptengines-javascript:1.1]
    at javax.script.CompiledScript.eval(CompiledScript.java:30)[425:org.apache.servicemix.specs.scripting-api-1.0:2.0.0.redhat-60065]
    at org.apache.camel.builder.script.ScriptBuilder.runScript(ScriptBuilder.java:357)[270:org.apache.camel.camel-script:2.10.0.redhat-60065]
    at org.apache.camel.builder.script.ScriptBuilder.evaluateScript(ScriptBuilder.java:340)[270:org.apache.camel.camel-script:2.10.0.redhat-60065]
    ... 55 more

Any help is much appreciated.

Note:

  1. I'm using eval here instead of JSON.parse as I believe JSON.parse is not implemented in Rhino 1.6R7. I get a 'JSON is not defined' error when trying to use JSON.parse

  2. I cannot upgrade Rhino, I have to use 1.6R7

Rory
  • 4,030
  • 4
  • 17
  • 21
  • From the exception message it looks like `resp` is a byte array, not an object. Are you sure `getBody()` is returning a string, or could it be returning a byte array? – Richard Neish Jul 07 '15 at 10:29
  • @RichardNeish yes I think resp is a byte array, but I am unsure how to convert it to a String? Tried String(exchange.getIn().getBody()), eval (String(exchange.getIn().getBody())), and exchange.getIn().getBody(String.class). Last one doesn't work at all since it's java not javascript, and Camel docs don't provide much info: http://camel.apache.org/using-getin-or-getout-methods-on-exchange.html, http://camel.apache.org/javascript.html, http://camel.apache.org/scripting-languages.html, http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/Message.html#getBody(java.lang.Class) – Rory Jul 07 '15 at 10:42
  • Looking at http://stackoverflow.com/a/3195961/274350 you should try `eval(String.fromCharCode.apply(String, resp));` – Richard Neish Jul 07 '15 at 13:05
  • Thanks @RichardNeish, though that doesn't work either, claims resp is not an array: Caused by: org.mozilla.javascript.EcmaError: TypeError: second argument to Function.prototype.apply must be an array (#3) – Rory Jul 07 '15 at 13:15

0 Answers0