我已经获得了一大堆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 []格式可接受的内容。我可以选择回到标准的“字符串”字段,但我希望能够为用户提供他们可以提供的“无限”数量的文本。
我们非常感谢任何建议。
答案 0 :(得分:0)
我不确定@Lob类型列的问题是什么,以及为什么它不想将数据推送到数据库中;然而,最终,我改变了
@Lob
到
@Type(type="org.hibernate.type.StringClobType")
private String otherNeeds;
然后我能够更直接地管理它,并通过REST调用将内容推送到数据库中。
答案 1 :(得分:0)
当属性类型为byte []并且响应在String中时,jackson认为数据是base64编码并尝试解码并将其转换为byte []。但是,当您将类型更改为String时,不会发生此类转换,并且字符串将直接保存在数据库中。