package org.immutables.fixture.jackson;
import static org.immutables.check.Checkers.check;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.util.StdConverter;
import org.immutables.value.Value;
import org.junit.Test;
public class BuilderDeserializationTest {
@Value.Immutable
abstract static class IntValueClass {
@JsonValue
abstract Integer getValue();
@JsonCreator
static IntValueClass of(final Integer value) {
return ImmutableIntValueClass.builder().value(value).build();
}
}
@Value.Immutable
@JsonDeserialize(as = ImmutableWorkingType.class)
static abstract class WorkingType {
@JsonProperty("int_value_property")
@JsonSerialize(converter = IntValueOverrideConverter.StringSerializer.class)
@JsonDeserialize(converter = IntValueOverrideConverter.StringDeserializer.class)
abstract IntValueClass getIntValue();
}
@Value.Immutable
@JsonDeserialize(builder = ImmutableBrokenType.Builder.class)
static abstract class BrokenType {
@JsonProperty("int_value_property")
@JsonSerialize(converter = IntValueOverrideConverter.StringSerializer.class)
@JsonDeserialize(converter = IntValueOverrideConverter.StringDeserializer.class)
abstract IntValueClass getIntValue();
}
static class IntValueOverrideConverter {
static class StringSerializer extends StdConverter<IntValueClass, String> {
@Override
public String convert(final IntValueClass value) {
return value.getValue().toString();
}
}
static class StringDeserializer extends StdConverter<String, IntValueClass> {
@Override
public IntValueClass convert(final String value) {
return IntValueClass.of(Integer.parseInt(value));
}
}
}
final ObjectMapper MAPPER = new ObjectMapper();
final IntValueClass INT_VALUE = IntValueClass.of(1);
@Test
public void workingTest() throws Exception {
WorkingType someType = ImmutableWorkingType.builder()
.intValue(INT_VALUE)
.build();
String serialized = MAPPER.writeValueAsString(someType);
check(serialized).is("{\"int_value_property\":\"1\"}");
WorkingType someType2 = MAPPER.readValue(serialized, WorkingType.class);
check(someType2).is(someType);
}
@Test
public void brokenTest() throws Exception {
BrokenType someType = ImmutableBrokenType.builder()
.intValue(INT_VALUE)
.build();
String serialized = MAPPER.writeValueAsString(someType);
check(serialized).is("{\"int_value_property\":\"1\"}");
BrokenType someType2 = MAPPER.readValue(serialized, BrokenType.class);
check(someType2).is(someType);
}
}