또 다른 옵션은 InjectableValues 및 @JacksonInject 를 사용하는 것 입니다. 항상 동일한 값이 아니라 DB 또는 특정 경우 다른 곳에서 가져 오는 값을 사용해야하는 경우 매우 유용합니다. 다음은 사용 예입니다 JacksonInject
.
protected static class Some {
private final String field1;
private final String field2;
public Some(@JsonProperty("field1") final String field1,
@JsonProperty("field2") @JacksonInject(value = "defaultValueForField2",
useInput = OptBoolean.TRUE) final String field2) {
this.field1 = requireNonNull(field1);
this.field2 = requireNonNull(field2);
}
public String getField1() {
return field1;
}
public String getField2() {
return field2;
}
}
@Test
public void testReadValueInjectables() throws JsonParseException, JsonMappingException, IOException {
final ObjectMapper mapper = new ObjectMapper();
final InjectableValues injectableValues =
new InjectableValues.Std().addValue("defaultValueForField2", "somedefaultValue");
mapper.setInjectableValues(injectableValues);
final Some actualValueMissing = mapper.readValue("{\"field1\": \"field1value\"}", Some.class);
assertEquals(actualValueMissing.getField1(), "field1value");
assertEquals(actualValueMissing.getField2(), "somedefaultValue");
final Some actualValuePresent =
mapper.readValue("{\"field1\": \"field1value\", \"field2\": \"field2value\"}", Some.class);
assertEquals(actualValuePresent.getField1(), "field1value");
assertEquals(actualValuePresent.getField2(), "field2value");
}
생성자를 사용하여 엔티티를 생성하는 경우 (일반적으로 lombok 에서 @Value 또는 @AllArgsConstructor 를 사용할 때 발생 함 ) 생성자가 아니라 속성에 넣는 경우 예상대로 작동하지 않습니다-주입 된 값 필드는 항상 상관없이 넣어 여부, JSON으로 값을 대체하지 않습니다 에 . 이는 jackson이 생성자가 호출 된 후 해당 속성을 주입하기 때문입니다 (속성이 인 경우에도 )-필드가 생성자에서 올바른 값으로 설정되었지만 재정의되었습니다 (확인 : https://github.com/FasterXML/jackson-databind/ 문제 / 2678 (@JacksonInject
useInput = OptBoolean.TRUE
@JacksonInject
final
및 https://github.com/rzwitserloot/lombok/issues/1528#issuecomment-607725333자세한 내용은이 테스트를 통과했습니다 .
protected static class Some {
private final String field1;
@JacksonInject(value = "defaultValueForField2", useInput = OptBoolean.TRUE)
private final String field2;
public Some(@JsonProperty("field1") final String field1,
@JsonProperty("field2") @JacksonInject(value = "defaultValueForField2",
useInput = OptBoolean.TRUE) final String field2) {
this.field1 = requireNonNull(field1);
this.field2 = requireNonNull(field2);
}
public String getField1() {
return field1;
}
public String getField2() {
return field2;
}
}
@Test
public void testReadValueInjectablesIncorrectBehavior() throws JsonParseException, JsonMappingException, IOException {
final ObjectMapper mapper = new ObjectMapper();
final InjectableValues injectableValues =
new InjectableValues.Std().addValue("defaultValueForField2", "somedefaultValue");
mapper.setInjectableValues(injectableValues);
final Some actualValueMissing = mapper.readValue("{\"field1\": \"field1value\"}", Some.class);
assertEquals(actualValueMissing.getField1(), "field1value");
assertEquals(actualValueMissing.getField2(), "somedefaultValue");
final Some actualValuePresent =
mapper.readValue("{\"field1\": \"field1value\", \"field2\": \"field2value\"}", Some.class);
assertEquals(actualValuePresent.getField1(), "field1value");
assertEquals(actualValuePresent.getField2(), "somedefaultValue");
}
이것이 비슷한 문제를 가진 사람에게 도움이되기를 바랍니다.
PS 저는 jackson v. 2.9.6을 사용하고 있습니다.