1 package com.fasterxml.jackson.failing; 2 3 import java.util.Objects; 4 5 import com.fasterxml.jackson.annotation.JacksonInject; 6 import com.fasterxml.jackson.annotation.JsonProperty; 7 import com.fasterxml.jackson.annotation.OptBoolean; 8 9 import com.fasterxml.jackson.databind.*; 10 import com.fasterxml.jackson.databind.json.JsonMapper; 11 12 // [databind#2678]: constructor-passed data overridden via field/setter injection 13 public class JacksonInject2678Test extends BaseMapTest 14 { 15 // [databind#2678] 16 protected static class Some { 17 private String field1; 18 19 @JacksonInject(value = "defaultValueForField2", useInput = OptBoolean.TRUE) 20 private String field2; 21 Some(@sonProperty"field1") final String field1, @JsonProperty("field2") @JacksonInject(value = "defaultValueForField2", useInput = OptBoolean.TRUE) final String field2)22 public Some(@JsonProperty("field1") final String field1, 23 @JsonProperty("field2") 24 @JacksonInject(value = "defaultValueForField2", useInput = OptBoolean.TRUE) 25 final String field2) { 26 //System.err.println("CTOR: setField2 as ["+field2+"]"); 27 this.field1 = Objects.requireNonNull(field1); 28 this.field2 = Objects.requireNonNull(field2); 29 } 30 getField1()31 public String getField1() { 32 return field1; 33 } 34 getField2()35 public String getField2() { 36 return field2; 37 } 38 } 39 40 // [databind#2678] testReadValueInjectables()41 public void testReadValueInjectables() throws Exception { 42 final InjectableValues injectableValues = 43 new InjectableValues.Std().addValue("defaultValueForField2", "somedefaultValue"); 44 final ObjectMapper mapper = JsonMapper.builder() 45 .injectableValues(injectableValues) 46 .build(); 47 48 final Some actualValueMissing = mapper.readValue("{\"field1\": \"field1value\"}", Some.class); 49 assertEquals("field1value", actualValueMissing.getField1()); 50 assertEquals("somedefaultValue", actualValueMissing.getField2()); 51 52 final Some actualValuePresent = mapper.readValue( 53 "{\"field1\": \"field1value\", \"field2\": \"field2value\"}", Some.class); 54 assertEquals("field1value", actualValuePresent.getField1()); 55 56 // if I comment @JacksonInject that is next to the property the valid assert is the correct one: 57 assertEquals("field2value", actualValuePresent.getField2()); 58 } 59 } 60