ConverterFromInterface2617Test.java
package tools.jackson.databind.convert;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.annotation.JsonProperty;
import tools.jackson.databind.annotation.JsonDeserialize;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.testutil.DatabindTestUtil;
import tools.jackson.databind.util.StdConverter;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* Test for https://github.com/FasterXML/jackson-databind/issues/2617
*
* When deserializing a class using @JsonDeserialize(converter = ...),
* if the converter's FROM type is an interface using @JsonDeserialize(as = ...),
* deserialization fails. Jackson is failing to use the "as" setting when used
* as a FROM class in a converter.
*/
public class ConverterFromInterface2617Test extends DatabindTestUtil
{
@JsonDeserialize(converter = FromConverter.class)
static class Concrete {
private String field;
public String getField() {
return field;
}
public void setField(String field) {
this.field = field;
}
}
@JsonDeserialize(as = FromImpl.class)
interface From {
String field();
}
static class FromImpl implements From {
@JsonProperty
private String field;
@Override
public String field() {
return field;
}
}
static class FromConverter extends StdConverter<From, Concrete> {
@Override
public Concrete convert(From value) {
Concrete test = new Concrete();
test.setField(value.field());
return test;
}
}
private final ObjectMapper MAPPER = newJsonMapper();
@Test
public void testConverterFromInterface() throws Exception
{
Concrete value = MAPPER.readValue("{\"field\": \"foo\"}", Concrete.class);
assertEquals("foo", value.getField());
}
}