문제점
클래스에 @AllArgsConstructor
적용하고, 필드에 @JsonIgnore
하면 ignore 안되는 문제.
@Data
@AllArgsConstructor
@NoArgsConstructor
class Obj {
@JsonIgnore
private String ignoredValue;
private String jsonValue;
}
{"ignoredValue":null,"jsonValue":null}
원인
컴파일하면 생성자에 @ConstructorProperties
가 붙어서 ignore 취소.
import java.beans.ConstructorProperties;
public class Obj {
@ConstructorProperties({"ignoredValue", "jsonValue"})
public Obj(String ignoredValue, String jsonValue) {
this.ignoredValue = ignoredValue;
this.jsonValue = jsonValue;
}
...
}
해결방안
lombok 1.14 이상 버전에서는 프로젝트 루트 디렉토리에 lombok.config
파일 생성하고, 아래 옵션 추가(Configuration system-lombok).
lombok.anyConstructor.suppressConstructorProperties=true
다른 방법으로는, @AllArgsConstructor
에 suppressConstructorProperties 옵션값으로 적용할 수 있지만, Deprecated 됨.
@Data
@AllArgsConstructor(suppressConstructorProperties = true)
@NoArgsConstructor
class Obj {
@JsonIgnore
private String ignoredValue;
private String jsonValue;
}
public @interface AllArgsConstructor {
/**
* Constructors are generated with the {@link java.beans.ConstructorProperties} annotation.
* However, this annotation is new in 1.6 which means those compiling for 1.5 will need
* to set this value to true.
*
* @deprecated THIS FEATURE WILL BE REMOVED after March 31st 2015. Use configuration key {@link ConfigurationKeys#ANY_CONSTRUCTOR_SUPPRESS_CONSTRUCTOR_PROPERTIES} instead.
*/
@Deprecated
boolean suppressConstructorProperties() default false;
...
}
(+ 2017.02.25) inner 클래스에서는 적용이 안되므로 @AllArgsConstructor
지양한다.
그외 다른 방법
테스트 코드
@Test
public void jsonIgnoreTest() throws JsonProcessingException {
Obj obj = new Obj();
System.out.println(new ObjectMapper().writeValueAsString(obj));
}
Use @JsonIgnore
to custom getter
@Data
@AllArgsConstructor
@NoArgsConstructor
class Obj {
private String ignoredValue;
private String jsonValue;
@JsonIgnore
public String getIgnoredValue() {
return ignoredValue;
}
}
{"jsonValue":null}
Use @JsonIgnoreProperties
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(value = "ignoredValue")
class Obj {
private String ignoredValue;
private String jsonValue;
}
{"jsonValue":null}
Use @JsonProperty
@Data
@AllArgsConstructor
@NoArgsConstructor
class Obj {
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String ignoredValue;
private String jsonValue;
}
{"jsonValue":null}
Use @Getter(onMethod)
to Field
@Data
@AllArgsConstructor
@NoArgsConstructor
class Obj {
@Getter(onMethod = @__(@JsonIgnore))
private String ignoredValue;
private String jsonValue;
}
{"jsonValue":null}
Use @Build
instead of @AllArgsConstructor
@Data
@Build
@NoArgsConstructor
class Obj {
@JsonIgnore
private String ignoredValue;
private String jsonValue;
}
{"jsonValue":null}
Use @Value
@Data
안쓰고, @Value
사용(이건 해결방법이 아닌 듯..)
@Value
class Obj {
@JsonIgnore
private String ignoredValue = "a";
private String jsonValue = "t";
}
{"jsonValue":"t"}
Use @JsonAutoDetect
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE)
class Obj {
private String ignoredValue;
private String jsonValue;
}
{}