【问题标题】:JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')JsonParseException:意外字符('<'(代码 60)):需要一个有效值(数字、字符串、数组、对象、'true'、'false' 或 'null')
【发布时间】:2016-08-31 04:53:03
【问题描述】:

我有一个程序可以在服务器内的 docker 容器中将新患者插入 HBase。一切正常,直到我尝试将连接 IP 更改为 phoenix 查询服务器以运行 JUnit 测试。我在属性文件中设置 URL,如下所示:

java.lang.RuntimeException: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: java.io.StringReader@1105b1f; line: 1, column: 2] 
...
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at [Source: java.io.StringReader@1105b1f; line: 1, column: 2] 

我不确定为什么会收到 json 解析异常。由于外部api,调试没有帮助。我什至不知道异常是否与我的属性文件中的 URL 格式、患者(以 xml 格式出现)或什至可能与 phoenix 客户端有关。

我已经启动了 phoenix 查询服务器,它看起来可以连接到它,因为它之前抛出了“连接被拒绝”异常,现在它没有。

我在 pom.xml 中添加了 phoenix,如下所示:

<dependency>
    <groupId>org.apache.phoenix</groupId>
    <artifactId>phoenix-server</artifactId>
    <version>4.7.0-HBase-1.1</version>
</dependency>

但我不知道是否需要为 phoenix-thin-client 添加其他内容。如果必须,我找不到该依赖项,所以我假设它已包含在内。

感谢任何帮助!

编辑:

这是服务器抛出的异常:

> > 2016-05-05 08:52:11,979 WARN org.eclipse.jetty.server.HttpChannel: / java.lang.RuntimeException:
> org.apache.calcite.avatica.com.google.protobuf.InvalidProtocolBufferException:
> While parsing a protocol message, the input ended unexpectedly in the
> middle of a field.  This could mean either that the input has been
> truncated or that an embedded message misreported its own length.
>         at org.apache.calcite.avatica.remote.AbstractHandler.apply(AbstractHandler.java:98)
>         at org.apache.calcite.avatica.remote.ProtobufHandler.apply(ProtobufHandler.java:38)
>         at org.apache.calcite.avatica.server.AvaticaProtobufHandler.handle(AvaticaProtobufHandler.java:68)
>         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:497)
>         at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
>         at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:245)
>         at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
>         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) Caused by: org.apache.calcite.avatica.com.google.protobuf.InvalidProtocolBufferException:
> While parsing a protocol message, the input ended unexpectedly in the
> middle of a field.  This could mean either that the input has been
> truncated or that an embedded message misreported its own length.
>         at org.apache.calcite.avatica.com.google.protobuf.InvalidProtocolBufferException.truncatedMessage(InvalidProtocolBufferException.java:70)
>         at org.apache.calcite.avatica.com.google.protobuf.CodedInputStream.skipRawBytesSlowPath(CodedInputStream.java:1293)
>         at org.apache.calcite.avatica.com.google.protobuf.CodedInputStream.skipRawBytes(CodedInputStream.java:1276)
>         at org.apache.calcite.avatica.com.google.protobuf.CodedInputStream.skipField(CodedInputStream.java:197)
>         at org.apache.calcite.avatica.com.google.protobuf.CodedInputStream.skipMessage(CodedInputStream.java:273)
>         at org.apache.calcite.avatica.com.google.protobuf.CodedInputStream.skipField(CodedInputStream.java:200)
>         at org.apache.calcite.avatica.proto.Common$WireMessage.<init>(Common.java:11627)
>         at org.apache.calcite.avatica.proto.Common$WireMessage.<init>(Common.java:11595)
>         at org.apache.calcite.avatica.proto.Common$WireMessage$1.parsePartialFrom(Common.java:12061)
>         at org.apache.calcite.avatica.proto.Common$WireMessage$1.parsePartialFrom(Common.java:12055)
>         at org.apache.calcite.avatica.com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:137)
>         at org.apache.calcite.avatica.com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:168)
>         at org.apache.calcite.avatica.com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:180)
>         at org.apache.calcite.avatica.com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:185)
>         at org.apache.calcite.avatica.com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49)
>         at org.apache.calcite.avatica.proto.Common$WireMessage.parseFrom(Common.java:11760)
>         at org.apache.calcite.avatica.remote.ProtobufTranslationImpl.parseRequest(ProtobufTranslationImpl.java:236)
>         at org.apache.calcite.avatica.remote.ProtobufHandler.decode(ProtobufHandler.java:42)
>         at org.apache.calcite.avatica.remote.ProtobufHandler.decode(ProtobufHandler.java:28)
>         at org.apache.calcite.avatica.remote.AbstractHandler.apply(AbstractHandler.java:95)
>         ... 11 more

【问题讨论】:

  • 您可能正在获取 html。我不明白为什么调试无济于事......但你说你期望 xml 回来 - 这不是 json。
  • 如果调试不起作用,您可以尝试使用网络嗅探器捕获服务器响应。
  • 在我的情况下,这是由于服务器关闭并抛出 404 Not Found。请检查您的响应代码。

标签: java maven exception junit phoenix


【解决方案1】:

您是否正确升级了您的 Phoenix 服务器?看起来它试图同时使用 JSON 和 Protocol Buffer 协议进行连接。它应该是其中之一。

【讨论】:

  • 我根本没有改变序列化。我想这就是问题所在。进行一些调试,我看到它默认将 json 设置为 phoenix.queryserver.serialization,但我不知道如何更改它。它在连接中做这样的事情吗? properties.setProperty("phoenix.queryserver.serialization", "PROTOBUF");
  • 尝试在您的 jdbc 连接字符串中添加 serialization=PROTOBUF。虽然我认为如果两者都是 4.7 版,这将是服务器和客户端的默认设置
  • 这行得通。显然 JSON 是默认值(或者“其他人”正在某处更改它,我不知道!)。谢谢!!!
【解决方案2】:

检查您是否正确提供了授权、标头和其他参数。

我通过检查这些步骤解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-11
    • 2020-10-18
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多