IT

생성자가 @JsonCreator로 주석을 달았을 때 그 인수에 @JsonProperty로 주석을 달아야하는 이유는 무엇입니까?

lottoking 2020. 9. 9. 08:14
반응형

생성자가 @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;
  }

참고 URL : https://stackoverflow.com/questions/21920367/why-when-a-constructor-is-annotated-with-jsoncreator-its-arguments-must-be-ann

반응형