• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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