2016-08-09 58 views
1

Ich benutze Jackson ObjectMapper, um meine Antwort zu lesen. Auch bin ich mit Frühling ResponseErrorHandler diese Antwort zu handhaben:Java - Jackson Anmerkungen, um keinen geeigneten Konstruktor zu behandeln

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

Ich weiß, dass Problem kann durch Hinzufügen Standardkonstruktors dadurch gelöst, aber ich kann das nicht tun. Ich kann die ServiceError-Klasse überhaupt nicht ändern.

Fehler bekam ist diese:

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

Gibt es irgendwelche Jackson Anmerkungen solche Ausgabe zu unterstützen?

Antwort

2

Ja, wenn die Klasse in Frage geeigneten Konstruktor zu verwenden, können Sie @JsonCreator, um anzuzeigen, verwenden, dass das Konstruktor benutzt werden. Wenn mehrere Argumente erforderlich sind, müssen Sie außerdem @JsonProperty hinzufügen, um anzugeben, welche JSON-Eigenschaft welchem ​​Argument zugeordnet werden soll.

+0

Haben Sie ein Beispiel, wie es aussehen sollte? – Laurynas

+0

Ich dachte nicht, dass es möglich ist, @JsonCreator zu verwenden, ohne die Klasse selbst zu ändern, und die Frage besagt, dass ServiceError nicht geändert werden kann? –

+0

@EssexBoy Sie können Mix-In-Anmerkungen verwenden, auch wenn Sie die Klasse selbst nicht ändern können; Siehe zB http://www.baeldung.com/jackson-annotations (Abschnitt 8) oder http://stackoverflow.com/questions/28857897/how-do-correctly-use-jackson-mixin-annotation-to- Instanziieren Sie eine Drittanbieter-Klasse (in Ihrem Fall wird es funktionieren, da der Typ keiner der JDK-Typen ist) – StaxMan

2

definieren 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; 

    } 
} 

Dann registrieren Sie es mit Ihren 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()); 
}