를 사용하는 방법모버젼은 작동으로 필드 형식에서 요청을 체 모델 클래스에서 Rest API

0

질문

우리는 Java SpringBoot API 를 끝점고 우리는 전달 RequestBody 의 NotifyMoiChanges 클래스는 유형입니다. 에 NotifyMoiChanges 모델 클래스 우리는 하나의 제기는 인터페이스 유형입니다.

끝점 snippet:

@PostMapping("/notifyMOIChanges")
public ResponseEntity<Void> notifyMOIChangesPost(@RequestBody NotifyMoiChanges notifyMoiChanges) {
        logger.info("Received notifyMOIChanges request.");
        return ResponseEntity.noContent().build();
    }

RequestBody 모델 snippet:

public class NotifyMoiChanges {
  @JsonProperty("moiChanges")
  @Valid
  private List<MoiChange> moiChanges = new ArrayList<MoiChange>();
  ..... other attributes
}

public class MoiChange   {
      @JsonProperty("operation")
      private String operation = null;   //operation value can be "Type1" or "Type2"
    
      @JsonProperty("value")
      private OneOfMoiChangeValue value = null;   //value filed can be mapped with any of the OneOfMoiChangeValue Interface implentations  Type1MoiChangeValue or Type2MoiChangeValue.
    }

OneOfMoiChangeValue 인터페이스가 있는 두 개의 구현 Type1MoiChangeValue&Type2MoiChangeValue.

이 때 전달 RequestBody 기반으로 작업 제출 데이터를 매핑'value'분야의 요청으로 몸의 인터페이스 구현 Type1MoiChangeValue 또는 Type2MoiChangeValue.

public interface OneOfMoiChangeValue {

}

Type1MoiChangeValue:

@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2021-11-16T11:51:46.436+05:30[Asia/Calcutta]")
public class Type1MoiChangeValue  extends ArrayList<Type2MoiChangeValue > implements OneOfMoiChangeValue {

  @Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    return true;
  }

  @Override
  public int hashCode() {
    return Objects.hash(super.hashCode());
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class Type1MoiChangeValue {\n");
    sb.append("    ").append(toIndentedString(super.toString())).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(java.lang.Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }
}

Type2MoiChangeValue:

@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2021-11-16T11:51:46.436+05:30[Asia/Calcutta]")
public class Type2MoiChangeValue extends HashMap<String, Object> implements OneOfMoiChangeValue {

  @Override
  public boolean equals(java.lang.Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    return true;
  }

  @Override
  public int hashCode() {
    return Objects.hash(super.hashCode());
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class Type2MoiChangeValue {\n");
    sb.append("    ").append(toIndentedString(super.toString())).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(java.lang.Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }
}

우리가 사용하여 잭슨 parser. 어떻게 할 수 있습니다. 시기 바랍니다.

interface jackson java spring
2021-11-23 07:51:37
1

최고의 응답

1

당신이 필요해 부부의 변화에서의 코드고 결과적으로 귀하의 요청에 몸입니다. 첫 번째는 것입 업데이트 OneOfMoiChangeValue 의 부부와 함께 잭슨 주석을 할 수 있도록을 처리하는 방법을 알고 다른 하위에 기반 시설명 operation:

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;

import static com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY;
import static com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME;

@JsonTypeInfo(use = NAME, include = PROPERTY, property = "operation")
@JsonSubTypes({
  @JsonSubTypes.Type(value=Type1MoiChangeValue.class, name = "Type1"),
  @JsonSubTypes.Type(value=Type2MoiChangeValue.class, name = "Type2")
})
public interface OneOfMoiChangeValue {

}

즉,당신은 당신이 더 이상 필요 없 operation 숙박 시설에 MoiChange:

public class MoiChange {
      @JsonProperty("value")
      private OneOfMoiChangeValue value = null;   //value filed can be mapped with any of the OneOfMoiChangeValue Interface implentations  Type1MoiChangeValue or Type2MoiChangeValue.
}

대신,그것을 전해야 함 다른 모든 속성 OneOfMoiChangeValue는,그래서 뭔가를 따라 다음과 같은 라인:

{
    "moiChanges": 
    [
        {
            "value": {
                "operation": "Type1",
                (...)
            }    
        },
        {
            "value": {
                "operation": "Type2",
                (...)
            }    
        },
        (...)
    ]
}
2021-11-23 14:56:57

이것은 좋아 보인다. 나에게 그것을 시도하고 당신을 업데이트.
SuryaN

안녕@João,내가 지금 온 알고 내가 변경할 수 없는 요청을 몸과 추가 필드'가동'내부'value'특성으로 Req 몸으로 간주됩 표준 형식으로 권한이 없을 조작 할 수 있습니다. 그래서를 추가하지 않고 어떤 추가 필드에서 요청을 몸에 우리는 그것을 할 수 있습니까?
SuryaN

하지 않는 것이 나는 알고 있습니다. 유일한 옵션이 될 수 있는 사용자 지정 deserializer. 정말 좋아해 사람들이 어떻게 생각하는 소프트웨어는 돌에 설정되는 것과는 변경을 할 수 없습니다 어떤 방법으로(난 이것은 당신의 결정이다;)).
João Dias

예.동의합니다. :)우리가 사용하는 사용자 정의 디시리얼라이저 이 경우. 나는 새로운습니다. 도록을 작성하려고 일부 경우 나는 그것을 할 수 있습니다.
SuryaN

안녕@João Dias,내가 쓴 사용자 지정 deserializer 으로 당신이 말한 그것은했다. 또한 제안을 해야에 대한 답변에서 일할 것이 대부분의 경우 우리가 할 수 있는 일반적으로 통과하는 추가 필드에서 json. 나는 받아들이는 솔루션으로 그것이 정확했습니다. 당신의 도움에 대한 감사를 해결하기:)
SuryaN

당신은 환영합니다! 또한 고려를 추가하면 사용자 정의 디시리얼라이저에 대한 답변으로 받아들인것;)
João Dias

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................