2016-08-09 11 views
1

私はJackson ObjectMapperを使用して自分の応答を読みます。また、私はその応答を処理するために春ResponseErrorHandlerを使用しています: Java - Jackson適切なコンストラクタを処理しない注釈

@Override 
public void handleError(final ClientHttpResponse response) throws IOException { 
objectMapper.readValue(response.getBody(), ServiceError.class); 
} 

私はその問題は、既定のコンストラクタを追加することで解決することですることができます知っているが、私はそれを行うことはできません。 ServiceErrorクラスはまったく変更できません。

No suitable constructor found for type ... can not instantiate fromJSON object(need to add/enable type information?) 

は、このような問題をサポートするための任意のジャクソンの注釈があります:この1は

エラーが持っているのですか?

答えて

2

問題のクラスが使用するために、適切なコンストラクタを持っている場合は、[はい、あなたはそのコンストラクタがあることを示すために@JsonCreatorを使用することができます使用する。また、引数が複数ある場合は、@JsonPropertyを追加して、どのJSONプロパティをどの引数にマッピングするかを指定する必要があります。

+0

どのように表示されるべきですか? – Laurynas

+0

クラス自体を変更せずに@JsonCreatorを使用することはできないと思っていましたが、ServiceErrorを変更できないという質問がありましたか? –

+0

@EssexBoyクラス自体を変更できない場合でも、ミックスインアノテーションを使用できます。 f.ex http://www.baeldung.com/jackson-annotations(セクション8)またはhttp://stackoverflow.com/questions/28857897/how-do-correctly-use-jackson-mixin-annotation-to-を参照してください。インスタンス化するサードパーティのクラス(あなたの場合、型はJDKの型の1つではないので動作します) – StaxMan

2

その後JsonDeserializer

public class ServiceErrorSerializer extends JsonDeserializer<ServiceError> { 

    @Override 
    public ServiceError deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) 
      throws IOException { 

     ServiceError serviceError = new ServiceError(null, null); 

     ObjectCodec oc = jsonParser.getCodec(); 
     JsonNode node = oc.readTree(jsonParser); 
     serviceError.setName(node.get("name").asText()); 
     serviceError.setDescription(node.get("description").asText()); 

     return serviceError; 

    } 
} 

を定義し、あなたのobjectMapperに登録

@Test 
public void test1() throws Exception { 
    ServiceError serviceError = new ServiceError("Noby Stiles", "good footballer"); 
    serviceError.setName("Noby Stiles"); 
    serviceError.setDescription("good footballer"); 
    String json = new ObjectMapper().writeValueAsString(serviceError); 

    SimpleModule simpleModule = new SimpleModule(); 
    simpleModule.addDeserializer(ServiceError.class, new ServiceErrorSerializer()); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.registerModule(simpleModule); 

    ServiceError serviceError2 = objectMapper.readValue(json, ServiceError.class); 
    assertNotNull(serviceError2); 
    assertEquals("Noby Stiles", serviceError2.getName()); 
} 
関連する問題