생성자가 @JsonCreator로 주석을 달았을 때 그 인수에 @JsonProperty로 주석을 달아야하는 이유는 무엇입니까?
Jackson에서는 @JsonCreator
생성자에 주석으로 추가 할 때 인수에 @JsonProperty
. 그래서이 생성자는
public Point(double x, double y) {
this.x = x;
this.y = y;
}
이렇게됩니다 :
@JsonCreator
public Point(@JsonProperty("x") double x, @JsonProperty("y") double y) {
this.x = x;
this.y = y;
}
왜 필요한지 모르겠습니다. 설명해 주시겠습니까?
Jackson은 JSON 객체에서 생성자 필드를 전달하는 순서를 알아야합니다. 리플렉션을 사용하여 Java에서 매개 변수 이름에 액세스 할 수 없습니다. 이것이 주석 에서이 정보를 반복해야하는 이유입니다.
매개 변수 이름은 일반적으로 실행에 Java 코드에서 액세스 할 수 없습니다 (컴파일러에 의해 드롭되기 때문). 따라서 해당 기능을 원할 경우 액세스하려는 경우 Java 8의 내장 기능을 사용하거나 ParaNamer와 같은 라이브러리를 사용합니다. 있습니다.
따라서 Jackson을 사용할 때 생성자 인수에 대한 주석을 사용할 수 있습니다. 다음 Jackson 모듈 중 하나를 사용할 수 있습니다.
잭슨 모듈 변수 이름
이 모듈을 사용하면 Java 8을 사용할 때 주석이없는 생성자 인수를 얻을 수 있습니다 . 이를 사용하여 먼저 먼저 모듈을 등록해야합니다.
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new ParameterNamesModule());
그런 다음 -parameters 플래그를 사용하여 코드를 선택합니다.
javac -parameters ...
링크 : https://github.com/FasterXML/jackson-modules-java8/tree/master/parameter-names
잭슨 모듈 변수
주석 내부 검사를 구성하기 만하면 (주석에서 지적한대로 둘다는 아닙니다). 1.8 이전의 Java 버전에서 주석이없는 생성자 인수를 사용할 수 있습니다 .
ObjectMapper mapper = new ObjectMapper();
// either via module
mapper.registerModule(new ParanamerModule());
// or by directly assigning annotation introspector (but not both!)
mapper.setAnnotationIntrospector(new ParanamerOnJacksonAnnotationIntrospector());
링크 : https://github.com/FasterXML/jackson-modules-base/tree/master/paranamer
선택적으로 컴파일러가 생성자 매개 변수의 이름으로 메타 데이터를 도입하는 jdk8로 생성자 주석을 피할 수 있습니다. 그런 다음 jackson-module-parameter-names 모듈로 Jackson 은이 생성 할 수 있습니다. 주석없이 Post Jackson 에서 예제를 볼 수 있습니다.
Java 바이트 코드는 메소드 또는 인수의 이름을 유지하지 않습니다.
사실을이 올바르게 이해 하면 기본 생성자를 매개 변수화 된 생성자로 대체하므로 생성자를 호출하는 데 사용되는 JSON 키를 설명해야합니다.
다른 대로 어노테이션은 인수 이름이 수정없이 속성 이름으로 사용됨을 지정하여 이름을 비어있는 것으로 지정하여 있습니다.
java.bean.ConstructorProperties 주석을 사용할 수 있습니다. 훨씬 덜 장황하고 Jackson도 허용합니다. 예 :
import java.beans.ConstructorProperties;
@ConstructorProperties({"answer","closed","language","interface","operation"})
public DialogueOutput(String answer, boolean closed, String language, String anInterface, String operation) {
this.answer = answer;
this.closed = closed;
this.language = language;
this.anInterface = anInterface;
this.operation = operation;
}
'IT' 카테고리의 다른 글
여러 도메인을 폴더 액세스 제어 허용 출처 (0) | 2020.09.09 |
---|---|
Logstash가 파일을 재분석하도록 강제하는 방법은 무엇입니까? (0) | 2020.09.09 |
내 탐색 모음에서 목록 항목의 전체 영역을 링크로 클릭 할 수 있습니까? (0) | 2020.09.09 |
지도에 삽입하는 데 선호되는 / 관용적 인 방법은 무엇입니까? (0) | 2020.09.09 |
내 웹 사이트의 로고를 브라우저 탭의 아이콘 이미지로 설정해야 할 필요가 있습니까? (0) | 2020.09.09 |