Al Phaba :
Tengo una clase simple
public class AuthenticationToken {
public String token;
public AuthenticationToken(String token) {
this.token = token;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
Con Jackson que estoy tratando de asignar una cadena a este objeto como éste
private String input = "{\"token\":\"adf\"}";
@Test
public void whenJsonString_ThenCreateAuthenticationObject() throws IOException {
ObjectMapper jsonMapper = new ObjectMapper();
AuthenticationToken tokenObject = jsonMapper.readValue(input, AuthenticationToken.class);
assertThat(tokenObject).isNotNull();
}
Pero arroja la siguiente excepción
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `foo.AuthenticationToken` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"token":"adf"}"; line: 1, column: 2]
Traté de anotar la propiedad en mi AuthenticationToken como @JsonProperty pero esto también dio lugar en esta excepción.
TA:
Jackson será por defecto esperar un " vacío constructor" y llenará automáticamente su objeto por los captadores y definidores que se proporcionan para cada campo.
Por lo tanto la eliminación de los argumentos de su constructor ya se va a resolver su problema:
public class AuthenticationToken {
public String token;
public AuthenticationToken() {}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
También puede simplemente añadir un constructor vacío adicional si desea mantener su actual tal como es. Probado ambas opciones para su caso de prueba, ambos funcionan bien.