package com.fasterxml.jackson.databind.deser.builder; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; public class BuilderFailTest extends BaseMapTest { @JsonDeserialize(builder=SimpleBuilderXY.class) static class ValueClassXY { final int _x, _y; protected ValueClassXY(int x, int y) { _x = x+1; _y = y+1; } } static class SimpleBuilderXY { public int x, y; public SimpleBuilderXY withX(int x0) { this.x = x0; return this; } public SimpleBuilderXY withY(int y0) { this.y = y0; return this; } public ValueClassXY build() { return new ValueClassXY(x, y); } } // for [databind#761] @JsonDeserialize(builder = ValueBuilderWrongBuildType.class) static class ValueClassWrongBuildType { } static class ValueBuilderWrongBuildType { public int x; public ValueBuilderWrongBuildType withX(int x0) { this.x = x0; return this; } public ValueClassXY build() { return null; } } /* /********************************************************** /* Unit tests /********************************************************** */ private final ObjectMapper MAPPER = new ObjectMapper(); public void testBuilderMethodReturnInvalidType() throws Exception { final String json = "{\"x\":1}"; try { MAPPER.readValue(json, ValueClassWrongBuildType.class); fail("Missing expected JsonProcessingException exception"); } catch (InvalidDefinitionException e) { verifyException(e, "Build method"); verifyException(e, "has wrong return type"); } } public void testExtraFields() throws Exception { final String json = aposToQuotes("{'x':1,'y':2,'z':3}"); try { MAPPER.readValue(json, ValueClassXY.class); fail("should not pass"); } catch (UnrecognizedPropertyException e) { verifyException(e, "Unrecognized field \"z\""); } } }