package com.fasterxml.jackson.databind.introspect; import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.introspect.VisibilityChecker; public class TestAutoDetect extends BaseMapTest { static class PrivateBean { String a; private PrivateBean() { } private PrivateBean(String a) { this.a = a; } } // test for [databind#1347], config overrides for visibility @JsonPropertyOrder(alphabetic=true) static class Feature1347SerBean { public int field = 2; public int getValue() { return 3; } } // let's promote use of fields; but not block setters yet @JsonAutoDetect(fieldVisibility=Visibility.NON_PRIVATE) static class Feature1347DeserBean { int value; public void setValue(int x) { throw new IllegalArgumentException("Should NOT get called"); } } /* /******************************************************** /* Unit tests /******************************************************** */ private final ObjectMapper MAPPER = new ObjectMapper(); public void testPrivateCtor() throws Exception { // first, default settings, with which construction works ok ObjectMapper m = new ObjectMapper(); PrivateBean bean = m.readValue("\"abc\"", PrivateBean.class); assertEquals("abc", bean.a); // then by increasing visibility requirement: m = new ObjectMapper(); VisibilityChecker<?> vc = m.getVisibilityChecker(); vc = vc.withCreatorVisibility(JsonAutoDetect.Visibility.PUBLIC_ONLY); m.setVisibility(vc); try { m.readValue("\"abc\"", PrivateBean.class); fail("Expected exception for missing constructor"); } catch (JsonProcessingException e) { verifyException(e, "no String-argument constructor/factory"); } } // [databind#1347] public void testVisibilityConfigOverridesForSer() throws Exception { // first, by default, both field/method should be visible final Feature1347SerBean input = new Feature1347SerBean(); assertEquals(aposToQuotes("{'field':2,'value':3}"), MAPPER.writeValueAsString(input)); ObjectMapper mapper = new ObjectMapper(); mapper.configOverride(Feature1347SerBean.class) .setVisibility(JsonAutoDetect.Value.construct(PropertyAccessor.GETTER, Visibility.NONE)); assertEquals(aposToQuotes("{'field':2}"), mapper.writeValueAsString(input)); } // [databind#1347] public void testVisibilityConfigOverridesForDeser() throws Exception { final String JSON = aposToQuotes("{'value':3}"); // by default, should throw exception try { /*Feature1347DeserBean bean =*/ MAPPER.readValue(JSON, Feature1347DeserBean.class); fail("Should not pass"); } catch (JsonMappingException e) { verifyException(e, "Should NOT get called"); } // but when instructed to ignore setter, should work ObjectMapper mapper = new ObjectMapper(); mapper.configOverride(Feature1347DeserBean.class) .setVisibility(JsonAutoDetect.Value.construct(PropertyAccessor.SETTER, Visibility.NONE)); Feature1347DeserBean result = mapper.readValue(JSON, Feature1347DeserBean.class); assertEquals(3, result.value); } }