วิธีใช้ Inteface เป็นสนามประเภทในการร้องของศพนางแบบชั้นเรียนที่เหลืออยู่ในรูปแบบ api

0

คำถาม

เรามีของจาวา SpringBoot รูปแบบ api endpoint และเราผ่านเป็น RequestBody ของ NotifyMoiChanges ชั้นเรียนประเภทนี้ได้นะ ใน NotifyMoiChanges นางแบบชั้นเรียนเราจะมีหนึ่งยื่นซึ่งเป็นส่วนติดต่อแบบนั้น

Endpoint 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 เป็นส่วนติดต่อซึ่งมีสองคน implementations Type1MoiChangeValue&Type2MoiChangeValue.

ตอนนี้เมื่อฉันมองผ่านเป็น RequestBody ดูจากรอง'ปฏิบัติการ'ยื่นข้อมูลของฉันต้องบนแผนที่ของ'ค่า'สนามขอร้องของร่างกับเรื่องของส่วนติดต่อ implementations 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    ");
  }
}

เรากำลังใช้ตัวกระจายคำแจ็คสัน. ฉันต้องทำยังมัน ได้โปรดแนะนำ!

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

คำตอบที่ดีที่สุด

1

คุณจะต้องไปสองของการเปลี่ยนแปลงรหัสของคุณและอย่างที่มีจุดหมายในของคุณร้องของร่างกาย คนแรกคือต้องปรับปรุง OneOfMoiChangeValue กับสองสามของแจ็คสันหมายเหตุประกอบดังนั้นมันจะรู้วิธีรับมือเรื่องที่ต่างออก subtypes จากทรัพย์สินที่ชื่อ 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 ฉันแค่ตอนนี้มารู้ว่าฉันไม่สามารถเปลี่ยนสิ่งที่ร้องขอมาต้องการร่างกายและเพิ่มพิเศษสนาม'ปฏิบัติการ'ภายใน'ค่า'แอททริบิวต์ที่ Req ร่างกายของพิจารณาว่าเป็นรูปแบบมาตรฐานและไม่มีสิทธิ์ในการจัดการมัน ดังนั้นโดยไม่มีการเพิ่มอะไรพิเศษสองในการร้องของศพเราสามารถทำมัน?
SuryaN

ไม่ใช่ว่าฉันบเรื่องความสัมพันธ์ใดๆ มีแค่ทางเลือกเดียอาจจะเป็นกำหนดเอง deserializer. ฉันจริงๆเหมือนคนอื่นคิดว่าซอฟแวร์มันตั้งอยู่ในก้อนหินและสิ่งที่เปลี่ยนแปลงทำไม่ได้ในทางใดทางหนึ่ง(ฉันรู้ว่านี่มันไม่ใช่การตัดสินใจของคุณ;)).
João Dias

ใช่เห็นด้วยกับคุณ :)พวกเราต้องใช้กำหนดเอง deserializer ในคดีนี้ ฉันเป็นคนใหม่เพื่อมัน ดังนั้นพยายามจะเขียนบางอย่างถ้าฉันสามารถทำมันได้
SuryaN

สวัสดี@João Dias ฉันต้องเขียนเป็นกำหนดเอง deserializer อย่างที่คุณบอกว่ามันได้ผล ยังเป็นคนที่แนะนำคุณมีคำตอบที่จะทำงานส่วนใหญ่ของคดีอย่างที่เราสามารถโดยทั่วไปส่งที่พิเศษสองใน language. ฉันยอมรับทางแก้ของคุณอย่างที่มันถูกต้อง ขอบคุณสำหรับการช่วยเพื่อการแก้ไขมัน:)
SuryaN

คุณยินดีต้อนรับ! พิจารณายังเพิ่มของคุณกำหนดเอง deserializer เป็นคำตอบและยอมรับมัน;)
João Dias

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่