2015-01-20 3 views
0

Spring MVC Java 응용 프로그램에서 Jersey REST API를 사용하고 있습니다. JSON 처리를 위해 Jackson을 사용하고 있습니다. 일부 프로젝트의 일부 필드를 필터링하기 위해 Genson을 내 프로젝트에 추가했습니다. 그리고 저는 Genson 만 사용하려고하며 남은 것은 Jackson을 사용하고 싶습니다.JensBindingException이있는 Genson JsonBindingException : 형식을 java.lang.String으로 변환 할 수 없습니다.

Jersey가 클래스 경로 (Got to know from this link)에있을 때 Jersey가 Genson을 기본적으로 사용하도록 설정하여 Jersey REST API를 사용하는 동안 예외가 발생합니다.

다음은 웹 서비스에 연결에서 내 코드를하고 데이터를 얻을 내가

javax.ws.rs.WebApplicationException: com.owlike.genson.JsonBindingException: Could not deserialize to type class java.lang.String 
    at com.owlike.genson.ext.jaxrs.GensonJsonConverter.readFrom(GensonJsonConverter.java:130) 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:553) 
    at com.sun.jersey.api.client.ClientResponse.getEntity(ClientResponse.java:506) 
    at com.myapp.WebHttpClient.connect(WebHttpClient.java:74) 
    at com.myapp.connection.connectors.WebConnector.getData(WebConnector.java:39) 
    at com.myapp.adapter.impl.SourceAdapter.getData(SourceAdapter.java:29) 
    at com.myapp.service.impl.WebServiceImpl.adapter(WebServiceImpl.java:174) 
    at com.myapp.service.impl.WebServiceImpl.connect(WebServiceImpl.java:107) 
    ... 41 more 
Caused by: com.owlike.genson.JsonBindingException: Could not deserialize to type class java.lang.String 
    at com.owlike.genson.Genson.deserialize(Genson.java:398) 
    at com.owlike.genson.ext.jaxrs.GensonJsonConverter.readFrom(GensonJsonConverter.java:128) 
    ... 48 more 
Caused by: com.owlike.genson.stream.JsonStreamException: Readen value can not be converted to String 
    at com.owlike.genson.stream.JsonReader.valueAsString(JsonReader.java:200) 
    at com.owlike.genson.convert.DefaultConverters$StringConverter.deserialize(DefaultConverters.java:364) 
    at com.owlike.genson.convert.DefaultConverters$StringConverter.deserialize(DefaultConverters.java:351) 
    at com.owlike.genson.convert.NullConverter$NullConverterWrapper.deserialize(NullConverter.java:56) 
    at com.owlike.genson.Genson.deserialize(Genson.java:396) 
    ... 49 more 

선 (74)는 stringResponse = response.getEntity(String.class);을 말한다 다음과 같은 예외를 받고 있어요

public String connect() throws Exception { 
     Client client = Client.create(); 
     try { 
      String auth = new String(Base64.encode(userName + COLON + password)); 
      WebResource webResource = client 
        .resource(webServiceUrl); 
      ClientResponse response = webResource 
        .header(AUTHORIZATION, BASIC + auth).type(APPLICATION_JSON) 
        .accept(APPLICATION_JSON).get(ClientResponse.class); 
      //code to check response status code. 
       stringResponse = response.getEntity(String.class); 

     } catch (ClientHandlerException e) { 
      throw new Exception("Not a Valid Url."); 
     } finally { 
      client.destroy(); 
     } 
     return stringResponse; 
} 

잭슨

사용하여 문자열로 변환합니다.

저지에서 Genson을 비활성화하는 방법 또는 Genson을 사용하여이 문제를 해결하려면 어떻게합니까?

감사

+0

항상 genson을 사용하는 것이 좋으면 응답을 문자열로 보내는 대신 원하는 유형으로 직접 이동할 수 있습니다. – eugen

+0

String으로 원합니다. 그것을 어떻게 얻을 수 있습니까? – iCode

+0

여전히 Jax-RS에서 Genson을 비활성화해야하는 경우 새 릴리스에이 메커니즘이 포함되어 있습니다. 내 업데이트를 참조하십시오. – eugen

답변

3

Genson의 최신 문서에 최대 github에 http://owlike.github.io/genson/를 호스팅하고 있습니다. 어떻게 Genson 등을 사용하고자하는 경우 실제로 나에게

를 어떻게됩니까

는 명확하지 않다. 직렬화에만 Genson을 사용하고 있습니까? 저지를 통해 또는 직접 사용하고 계십니까?

getEntity (String.class)를 수행하면 Jersey는 Genson에게 들어오는 json을 문자열로 이동하도록 요청합니다. 일반적으로 json 형식은 문자열을 루트 값으로 허용하지 않습니다. 뉴저지 버전

솔루션

  1. 저지 2.X (최신 Genson 자료)로 업그레이드, 당신은 IMO (이 MessageBodyReader에 위임하지 않는 문자열로 올바른 동작을 입력을 요청할 때). 그런 다음이 문자열을 사용하여 원하는 유형의 문자를 모두 사용할 수 있습니다.

  2. ClientResponse의 getEntityInputStream 메소드를 사용하여 원시 InputStream을 가져 와서이를 String으로 변환하십시오.

  3. 다른 해결책은 MessageBodyReader의 Gensons 구현을 재정의하여 deser from String을 처리하지 못하게하는 것입니다. 바로 내 소리가 나지 않는다 동시에 JSON 변환을 처리하는 여러 libs와 갖는


. 특히 둘 다 (잭슨과 겐슨) 비슷한 기능을 제공합니다. an issue을 열어 JAX-RS 앱에서 Genson을 사용 중지 할 수있게했습니다.

업데이트 Genson 1.3 이상에서는 disable Genson in a Jax-RS app에 시스템을 제공합니다.

+1

나는 Jackson 만 사용하고있었습니다. 그러나 어떤 경우 직렬화하는 동안 POJO에서 필드를 제거해야했습니다. Jackson과 함께 @JsonFilter 주석을 추가해야하므로 더 복잡합니다. 주석이 POJO 클래스에 있으면 Jackson과 정상적으로 직렬화하는 동안 문제가 발생합니다. 그래서 저는 겐슨을 사용하고 있습니다. 하지만 저는 저지를 직접 사용하지 않고 사용하고 있습니다. – iCode

+0

그리고 Jackson과 함께 사용하고 Genson과 함께 존재하지 않는 기능이 있습니까? 솔루션 1을 선택하고 사용 사례를 다루는 경우 하나의 lib 만 유지하는 것이 좋습니다. Genson의 다음 릴리스에는 jax rs apps에서 시스템을 비활성화하는 시스템이 포함됩니다. – eugen

+0

저는 Genson을 사용하고 Jackson을 제거하려고합니다. 고마워요 :) – iCode

관련 문제