2017-04-04 4 views
3

RestTemplate과 함께 REST API를 사용하고 있습니다. API에서 얻는 응답에는 중첩 된 객체가 많이 있습니다. 여기에 예제와 같은 작은 조각이다 :CustomDeserializer에 기본 (arg 없음) 생성자가 없습니다.

"formularios": [ 
    { 
    "form_data_id": "123006", 
    "form_data": { 
     "form_data_id": "123006", 
     "form_id": "111", 
     "efs": { 
     "1": {}, 
     "2": "{\"t\":\"c\",\"st\":\"m\",\"v\":[{\"id\":\"3675\",\"l\":\"a) Just an example\",\"v\":\"1\"},{\"id\":\"3676\",\"l\":\"b) Another example.\",\"v\":\"2\"}]}" 
     } 
    } 

난 데 문제는 그 시대의 가장 "1"실제로는 그냥 "2"와 같은 콘텐츠를 가지고 있으며, 잭슨은 문자열로 구문 분석 "efs"개체에. 하지만 코드 스 니펫과 마찬가지로 API에서 빈을 보내고 Jackson이이를 Object로 가져 오므로 START_OBJECT에 대한 오류 메시지가 표시됩니다 (정확한 오류를 기억할 수는 없지만이 질문에 중요하지는 않음).).

그래서 사용자 지정 디시리얼라이저를 만들어 잭슨이 "1"을 읽을 때 빈 개체를 무시하고 null 문자열로 구문 분석합니다.

여기 내 사용자 지정 디시리얼라이저의 :

public class CustomDeserializer extends StdDeserializer<Efs> { 

public CustomDeserializer(Class<Efs> t) { 
    super(t); 
} 

@Override 
public Efs deserialize(JsonParser jp, DeserializationContext dc) 
     throws IOException, JsonProcessingException { 

    String string1 = null; 
    String string2 = null; 
    JsonToken currentToken = null; 

    while ((currentToken = jp.nextValue()) != null) { 
     if (currentToken.equals(JsonToken.VALUE_STRING)) { 
      if (jp.getCurrentName().equals("1")) { 
       string1 = jp.getValueAsString(); 
      } else { 
       string2 = jp.getValueAsString(); 
      } 

     } else { 
      if (jp.getCurrentName().equals("2")) { 
       string2 = jp.getValueAsString(); 
      } 

     } 
    } 
    return new Efs(string1, string2); 

    } 
} 

그리고 이것은 API의 응답 수신 할 때 나는 그것을 사용하고 방법입니다 : 내가 오류를 받고 있어요

ObjectMapper mapper = new ObjectMapper(); 
    SimpleModule mod = new SimpleModule("EfsModule"); 
    mod.addDeserializer(Efs.class, new CustomDeserializer(Efs.class)); 
    mapper.registerModule(mod); 


    List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); 
    MappingJackson2HttpMessageConverter jsonMessageConverter = new MappingJackson2HttpMessageConverter(); 
    jsonMessageConverter.setObjectMapper(mapper); 
    messageConverters.add(jsonMessageConverter); 


    RestTemplate restTemplate = new RestTemplate(); 
    restTemplate.setMessageConverters(messageConverters); 

을 :

CustomDeserializer has no default (no arg) constructor 

그러나 내가 뭘 잘못하고 있는지, 어떻게 해결하는지 정확히 알지 못합니다. 오랜 질문에 대한 도움과 사과에 감사 드리며 최대한 많은 문맥을 제공하고자했습니다.

답변

5

인수가없는 기본 생성자가 있어야합니다. 당신이 할 수있는 것은 (당신이 정말로 필요하지 않은 경우, 다른 하나 교체)를 만들 수 있습니다 :

public class CustomDeserializer extends StdDeserializer<Efs> { 

    public CustomDeserializer() { 
     super(Efs.class); 
    } 
    ... 
} 
+0

오 와우 내가 바보 하하 느낌을하지만, 그래 그것은 감사했다. – abril