JSON字符串到byte [] JSONParseException

时间:2014-01-16 23:19:16

标签: json angularjs rest entity lob

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

但是,我决定尝试使用其中一个实体字段,这样我就可以在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 []格式可接受的内容。我可以选择回到标准的“字符串”字段,但我希望能够为用户提供他们可以提供的“无限”数量的文本。

我们非常感谢任何建议。

2 个答案:

答案 0 :(得分:0)

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

@Lob

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

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

答案 1 :(得分:0)

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