[ https://issues.apache.org/jira/browse/CALCITE-1475?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15620636#comment-15620636 ]
Josh Elser commented on CALCITE-1475: ------------------------------------- Ok, I don't think this should be viewed as a regression in Avatica. Let me try to explain. This happens now because Calcite uses the "normal" com.fasterxml... package for jackson classes. The avatica "shaded" jar relocated the jackson classes to org.apache.calcite.avatica.shaded.com.fasterxml... This discrepancy is the cause for the breakage. Avatica is looking for the annotation in the relocated class name, while Calcite is expecting the non-relocated class to be picked up. IMO, the proper fix is to use the avatica-core dependency in Calcite. Avatica should not have been distributing a shaded jar to clients with bundled, non-relocated dependency classes in it; this is flat out bad/wrong. Because Calcite is using jackson itself, it needs to use the actual dependency, not the shaded Avatica client (because that dependency should *not* be visible to Calcite). If Calcite wants to create a single artifact (based on the calcite-core Maven module), then it should use the avatica-core module and use the shade plugin to relocate the dependencies. This would not be an issue as both Avatica and Calcite would be using Jackson relocated at the same place. > Jackson shading causes JsonIgnore to be ignored when serializing response as > JSON > --------------------------------------------------------------------------------- > > Key: CALCITE-1475 > URL: https://issues.apache.org/jira/browse/CALCITE-1475 > Project: Calcite > Issue Type: Bug > Components: avatica > Reporter: Julian Hyde > > I am getting an error while running > {{CalciteRemoteDriverTest.testRemotePrepareExecute}} because Avatica is > trying to serialize the field {{CalcitePrepare.CalciteSignature.rowType}} to > JSON. The field has the annotation {{@JsonIgnore}} but I surmise that that > annotation is being ignored because Jackson is being shaded inside Avatica. > Here is the error stack: > {noformat} > java.lang.AssertionError > at > org.apache.calcite.rel.type.RelDataTypeImpl.getFieldList(RelDataTypeImpl.java:146) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:654) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.impl.MapEntrySerializer.serializeDynamic(MapEntrySerializer.java:252) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.impl.MapEntrySerializer.serialize(MapEntrySerializer.java:197) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.impl.MapEntrySerializer.serialize(MapEntrySerializer.java:19) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeWithType(BeanSerializerBase.java:566) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.impl.TypeWrappedSerializer.serialize(TypeWrappedSerializer.java:32) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:130) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3559) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2909) > at > org.apache.calcite.avatica.remote.JsonHandler.encode(JsonHandler.java:70) > at > org.apache.calcite.avatica.remote.JsonHandler.encode(JsonHandler.java:37) > at > org.apache.calcite.avatica.remote.AbstractHandler.apply(AbstractHandler.java:96) > at > org.apache.calcite.avatica.remote.JsonHandler.apply(JsonHandler.java:52) > at > org.apache.calcite.avatica.server.AvaticaJsonHandler.handle(AvaticaJsonHandler.java:129) > at > org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:52) > at > org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) > at org.eclipse.jetty.server.Server.handle(Server.java:499) > at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) > at > org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) > at > org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) > at > org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) > at > org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) > at java.lang.Thread.run(Thread.java:745) > java.sql.SQLException: while preparing SQL: select * from "hr"."emps" > at org.apache.calcite.avatica.Helper.createException(Helper.java:56) > at org.apache.calcite.avatica.Helper.createException(Helper.java:41) > at > org.apache.calcite.avatica.AvaticaConnection.prepareStatement(AvaticaConnection.java:329) > at > org.apache.calcite.avatica.AvaticaConnection.prepareStatement(AvaticaConnection.java:165) > at > org.apache.calcite.jdbc.CalciteRemoteDriverTest.testRemotePrepareExecute(CalciteRemoteDriverTest.java:499) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) > at > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) > at > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) > at > org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) > at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) > at > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) > at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) > at > org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) > at > org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) > at org.junit.runners.ParentRunner.run(ParentRunner.java:363) > at org.junit.runner.JUnitCore.run(JUnitCore.java:137) > at > com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117) > at > com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) > at > com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262) > at > com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:84) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:498) > at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) > Caused by: java.lang.RuntimeException: > org.apache.calcite.avatica.com.fasterxml.jackson.core.JsonParseException: > Unexpected character ('<' (code 60)): expected a valid value (number, String, > array, object, 'true', 'false' or 'null') > at [Source: <html> > <head> > <meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/> > <title>Error 500 </title> > </head> > <body> > <h2>HTTP ERROR: 500</h2> > <p>Problem accessing /. Reason: > <pre> java.lang.AssertionError</pre></p> > <hr /><i><small>Powered by Jetty://</small></i> > </body> > </html> > ; line: 1, column: 2] > at > org.apache.calcite.avatica.remote.JsonService.handle(JsonService.java:71) > at > org.apache.calcite.avatica.remote.JsonService.apply(JsonService.java:126) > at > org.apache.calcite.avatica.remote.RemoteMeta$12.call(RemoteMeta.java:240) > at > org.apache.calcite.avatica.remote.RemoteMeta$12.call(RemoteMeta.java:236) > at > org.apache.calcite.avatica.AvaticaConnection.invokeWithRetries(AvaticaConnection.java:733) > at > org.apache.calcite.avatica.remote.RemoteMeta.prepare(RemoteMeta.java:235) > at > org.apache.calcite.avatica.AvaticaConnection.prepareStatement(AvaticaConnection.java:325) > ... 31 more > Caused by: > org.apache.calcite.avatica.com.fasterxml.jackson.core.JsonParseException: > Unexpected character ('<' (code 60)): expected a valid value (number, String, > array, object, 'true', 'false' or 'null') > at [Source: <html> > <head> > <meta http-equiv="Content-Type" content="text/html;charset=ISO-8859-1"/> > <title>Error 500 </title> > </head> > <body> > <h2>HTTP ERROR: 500</h2> > <p>Problem accessing /. Reason: > <pre> java.lang.AssertionError</pre></p> > <hr /><i><small>Powered by Jetty://</small></i> > </body> > </html> > ; line: 1, column: 2] > at > org.apache.calcite.avatica.com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1581) > at > org.apache.calcite.avatica.com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:533) > at > org.apache.calcite.avatica.com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:462) > at > org.apache.calcite.avatica.com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1624) > at > org.apache.calcite.avatica.com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:689) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3776) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3721) > at > org.apache.calcite.avatica.com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2726) > at > org.apache.calcite.avatica.remote.JsonService.decode(JsonService.java:53) > at > org.apache.calcite.avatica.remote.JsonService.apply(JsonService.java:124) > ... 36 more > {noformat} -- This message was sent by Atlassian JIRA (v6.3.4#6332)