कैसे करने के लिए उपयोग अंतरफलक के रूप में एक क्षेत्र में टाइप अनुरोध शरीर मॉडल वर्ग में बाकी एपीआई

0

सवाल

हम एक जावा SpringBoot एपीआई समापन बिंदु और हम पास के एक RequestBody के NotifyMoiChanges वर्ग के प्रकार. में NotifyMoiChanges मॉडल वर्ग हम एक दायर की है जो इंटरफ़ेस के प्रकार.

समापन बिंदु स्निपेट :

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

RequestBody मॉडल स्निपेट:

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 के आधार पर 'ऑपरेशन' दायर डेटा मैं नक्शा करने के लिए 'मूल्य' क्षेत्र के अनुरोध के साथ शरीर के किसी भी इंटरफ़ेस कार्यान्वयन 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

हाय @जोन , मैं अभी आया था पता है कि मैं नहीं कर सकता परिवर्तन के अनुरोध के शरीर और जोड़ने के अतिरिक्त क्षेत्र में 'ऑपरेशन' के अंदर 'मूल्य' विशेषता के रूप में Req शरीर माना जाता है के रूप में मानक प्रारूप और करने की अनुमति नहीं है यह हेरफेर. तो जोड़ने के बिना किसी भी अतिरिक्त क्षेत्र में अनुरोध कर सकते हैं हम यह करते हैं?
SuryaN

ऐसा नहीं है कि मैं कर रहा हूँ के बारे में पता. केवल एक विकल्प हो सकता है एक कस्टम deserializer. मैं वास्तव में पसंद है कि कैसे लोगों को लगता है कि सॉफ्टवेयर है एक पत्थर में सेट बात और है कि परिवर्तन नहीं किया जा सकता है में किसी भी तरह (मैं यह पता नहीं है अपने निर्णय ;) ).
João Dias

हाँ, आप के साथ सहमत हूँ. :) हम का उपयोग करने के लिए कस्टम deserializer इस मामले में. मैं नया हूँ यह करने के लिए. तो कोशिश कर कुछ लिखने के लिए अगर मैं इसे कर सकते हैं.
SuryaN

हाय @जोन डायस, मैंने लिखा एक कस्टम deserializer के रूप में आप ने कहा और यह काम किया. यह भी सुझाव आप में जवाब देना होगा काम के अधिकांश मामलों के रूप में हम कर सकते हैं आम तौर पर पास अतिरिक्त क्षेत्र में json. मैं कर रहा हूँ स्वीकार करने के अपने समाधान के रूप में यह सही था । आपकी मदद के लिए धन्यवाद करने के लिए इसे हल करने के लिए :)
SuryaN

आप का स्वागत कर रहे हैं! विचार भी जोड़ने के अपने कस्टम deserializer एक जवाब के रूप में है और इसे स्वीकार करते हैं ;)
João Dias

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में