【问题标题】:JSON string to byte[] JSONParseExceptionJSON字符串到字节[] JSONParseException
【发布时间】:2014-01-16 23:19:15
【问题描述】:

我已经得到了一大堆 angularJS、rest 和 entity 的东西一起工作,以便能够通过 REST 在我的 POSTGRES DB 中保存表单数据。

但是,我决定对其中一个实体字段尝试不同的方法,以便可以在数据库中存储更长的文本位。我想使用具有如下字段的实体:

   @Column
   private int age;

   @Lob
   @Column(length = 2147483647)
   private byte[] otherNeeds;

现在实体创建得很好。我在 JBoss Forge 脚手架的基础上构建了我的 REST 接口。只要我将“otherNeeds”字段保持为空,一切都可以通过 REST 保存表单。

这是我的表格:

    <input id="age" type="number" ng-model="primaryGuest.age"></input>

    <input id="otherNeeds" type="text" ng-maxlength="2147483647" ng-model="primaryGuest.otherNeeds"></input>

所有这些数据都正确传递到我在 AngularJS 中的 JavaScript 对象中,当我单击 save() 按钮时,我可以看到 POST 请求通过以下有效负载进入我的 REST 接口:

    {
    otherNeeds: "jjjjjj"
    age: "10"
    }

但是,从服务器返回的响应是一个例外:

Caused by: org.codehaus.jackson.JsonParseException: Failed to decode VALUE_STRING as base64 (MIME-NO-LINEFEEDS): Illegal character '"' (code 0x22) in base64 content
at [Source: org.apache.catalina.connector.CoyoteInputStream@1a37992c; line: 1, column: 67]
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433) [jackson-core-asl-1.9.9-redhat-2.jar:1.9.9-redhat-2]
at org.codehaus.jackson.impl.Utf8StreamParser.getBinaryValue(Utf8StreamParser.java:402) [jackson-core-asl-1.9.9-redhat-2.jar:1.9.9-redhat-2]
at org.codehaus.jackson.map.deser.std.PrimitiveArrayDeserializers$ByteDeser.deserialize(PrimitiveArrayDeserializers.java:289)
at org.codehaus.jackson.map.deser.std.PrimitiveArrayDeserializers$ByteDeser.deserialize(PrimitiveArrayDeserializers.java:275)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:697)
at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:580)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2704)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1315)
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:419)
at org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl.proceed(MessageBodyReaderContextImpl.java:105) [resteasy-jaxrs-2.3.6.Final-redhat-1.jar:2.3.6.Final-redhat-1]
at org.jboss.resteasy.plugins.interceptors.encoding.GZIPDecodingInterceptor.read(GZIPDecodingInterceptor.java:63) [resteasy-jaxrs-2.3.6.Final-redhat-1.jar:2.3.6.Final-redhat-1]
at org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl.proceed(MessageBodyReaderContextImpl.java:108) [resteasy-jaxrs-2.3.6.Final-redhat-1.jar:2.3.6.Final-redhat-1]
at org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:169) [resteasy-jaxrs-2.3.6.Final-redhat-1.jar:2.3.6.Final-redhat-1]
... 33 more

所以,我不确定如何处理这种情况,以将我的对象转换为 byte[] 格式可以接受的东西。我可以选择返回到标准的“字符串”字段,但我希望能够为用户提供他们可以提供的“无限”数量的文本。

任何建议将不胜感激。

【问题讨论】:

    标签: json angularjs rest entity lob


    【解决方案1】:

    我不确定@Lob 类型列的问题是什么,以及为什么它不想将数据推送到数据库中;然而,最终,我从

    @Lob
    

    @Type(type="org.hibernate.type.StringClobType")
    private String otherNeeds;
    

    然后我能够更直接地进行管理,并通过 REST 调用将内容推送到数据库中。

    【讨论】:

      【解决方案2】:

      当属性类型为 byte[] 且响应为 String 时,jackson 认为数据是 base64 编码并尝试对其进行解码并将其转换为 byte[]。但是当您将类型更改为 String 时,不会发生这种转换,并且字符串直接保存在数据库中。

      【讨论】:

        猜你喜欢
        • 2016-03-28
        • 2015-03-23
        • 2021-03-27
        • 1970-01-01
        • 2018-10-14
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多