0

我已经得到了一大堆 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[] 格式可以接受的东西。我可以选择返回到标准的“字符串”字段,但我希望能够为用户提供他们可以提供的“无限”数量的文本。

任何建议将不胜感激。

4

2 回答 2

0

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

@Lob

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

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

于 2014-01-22T03:44:26.330 回答
0

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

于 2016-09-26T16:30:16.930 回答