package com.fasterxml.jackson.databind.creators;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.databind.*;
public class RequiredCreatorTest extends BaseMapTest
{
static class FascistPoint {
int x, y;
@JsonCreator
public FascistPoint(@JsonProperty(value="x", required=true) int x,
@JsonProperty(value="y", required=false) int y)
{
this.x = x;
this.y = y;
}
}
private final ObjectReader POINT_READER = objectMapper().readerFor(FascistPoint.class);
public void testRequiredAnnotatedParam() throws Exception
{
FascistPoint p;
// First: fine if both params passed
p = POINT_READER.readValue(aposToQuotes("{'y':2,'x':1}"));
assertEquals(1, p.x);
assertEquals(2, p.y);
p = POINT_READER.readValue(aposToQuotes("{'x':3,'y':4}"));
assertEquals(3, p.x);
assertEquals(4, p.y);
// also fine if 'y' is MIA
p = POINT_READER.readValue(aposToQuotes("{'x':3}"));
assertEquals(3, p.x);
assertEquals(0, p.y);
// but not so good if 'x' missing
try {
POINT_READER.readValue(aposToQuotes("{'y':3}"));
fail("Should not pass");
} catch (JsonMappingException e) {
verifyException(e, "Missing required creator property 'x' (index 0)");
}
}
public void testRequiredGloballyParam() throws Exception
{
FascistPoint p;
// as per above, ok to miss 'y' with default settings:
p = POINT_READER.readValue(aposToQuotes("{'x':2}"));
assertEquals(2, p.x);
assertEquals(0, p.y);
// but not if global checks desired
ObjectReader r = POINT_READER.with(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES);
try {
r.readValue(aposToQuotes("{'x':6}"));
fail("Should not pass");
} catch (JsonMappingException e) {
verifyException(e, "Missing creator property 'y' (index 1)");
}
}
}