2014-01-16 6 views
0

POSTJES DB에서 REST를 통해 양식 데이터를 저장하기 위해 함께 사용하는 angularJS, 나머지 항목 및 엔티티 항목을 모두 확보했습니다.JSON string to byte [] JSONParseException

그러나 필자는 엔터티 필드 중 하나와 다른 것을 시도하여 DB에 더 긴 텍스트 비트를 저장할 수 있도록 결정했습니다. 다음과 같이 필드가있는 엔티티를 사용하려고했습니다.

@Column 
    private int age; 

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

엔티티가 잘 작성되었습니다. JBoss Forge 스캐 폴딩 기반의 REST 인터페이스를 구축했습니다. "otherNeeds"필드를 비워두면 REST를 통해 양식을 절약 할 수 있습니다.

는이 모든 데이터를 AngularJS와 내 자바 스크립트 객체로 올바르게 통과, 그리고 내가 클릭 할 때() 버튼을 저장한다
<input id="age" type="number" ng-model="primaryGuest.age"></input> 

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

, 나는 POST 요청이 내 휴식을 통해 이동 볼 수 있습니다 여기에

내 양식의 다음 페이로드 인터페이스 :

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: [email protected]; 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 
,617,451 :

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

그러나, 서버로부터 다시 응답은 예외

그래서이 시나리오를 처리하여 개체를 byte [] 형식으로 사용할 수있는 형식으로 변환하는 방법을 모르겠습니다. 표준 "문자열"필드로 돌아갈 수있는 옵션이 있지만 사용자에게 제공 할 수있는 "무제한"의 텍스트를 제공 할 수 있기를 원합니다.

모든 의견을 많이 주시면 감사하겠습니다.

답변

0

@Lob 유형 열에 어떤 문제점이 있는지, 왜 데이터를 DB로 푸시하지 않았는지 확실하지 않습니다. 그러나 결국, 나는

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

@Lob 

변경 그리고 나는이 더 노골적으로 관리하고 REST 호출을 통해 DB에 콘텐츠를 푸시 할 수 있었다.

0

속성 유형이 byte []이고 응답이 String 인 경우 jackson은 데이터가 base64로 인코딩되어 있다고 생각하고이를 디코딩하여 byte []로 변환하려고합니다. 그러나 유형을 String으로 변경하면 해당 변환이 수행되지 않고 문자열이 데이터베이스에 직접 저장됩니다.