답변:
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 바이트 코드는 메소드 또는 생성자 인수의 이름을 유지하지 않기 때문입니다.
@JsonProperty
주석 을 지원해야 할 것입니다
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;
}