Jackson - Deserialize Interface to enum
You are using Event
interface for field event
in Input
and jackson doesn't know anything about UserEvent
as implementation of this interface.
You can use custom JsonDeserializer
to get value:
public interface Event {
}
public static class Input
{
private Event event;
@JsonDeserialize(using = UserEventDeserializer.class)
public Event getEvent() {
return event;
}
public void setEvent(Event event) {
this.event = event;
}
}
public enum UserEvent implements Event
{
SIGNUP;
}
public static class UserEventDeserializer extends StdDeserializer<Event> {
protected UserEventDeserializer() {
super(Event.class);
}
@Override
public Event deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
return UserEvent.valueOf(p.getText());
}
}
@Test
public void converEnum() throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
Input input = objectMapper.readValue("{\n" +
" \"event\" : \"SIGNUP\"\n" +
"}", Input.class);
Assert.assertThat(input.getEvent(), Matchers.is(UserEvent.SIGNUP));
}
For a single enum the jsonschema2pojo-maven-plugin generates code like the following:
@JsonCreator
public static Foo fromValue(String value) {
Foo constant = CONSTANTS.get(value);
if (constant == null) {
throw new IllegalArgumentException(value);
} else {
return constant;
}
}
I guess you could write a factory method which is annotated with @JsonCreator and somehow decides which enum to choose. I'm not sure if it matters much where you put this method.