Rest Apı'sinde İstek Gövdesi modeli sınıfında alan türü olarak Inteface nasıl kullanılır

0

Soru

Bir Java SpringBoot API uç noktamız var ve NotifyMoiChanges sınıf türünde bir istek gövdesi iletiyoruz. NotifyMoiChanges model sınıfında, Arabirim türü olan bir dosyamız var.

Bitiş noktası parçacığı :

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

RequestBody Model parçacığı:

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 ve Type2MoiChangeValue olmak üzere iki uygulamaya sahip bir Arabirimdir.

Şimdi,' işlem ' dosyalanmış verilere dayanan bir istek gövdesini geçirdiğimde, İstek Gövdesinin 'değer' alanını Type1MoiChangeValue veya Type2MoiChangeValue Arabirim uygulamalarından herhangi biriyle eşleştirmem gerekiyor.

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    ");
  }
}

Jackson ayrıştırıcısını kullanıyoruz. Bunu nasıl yapabilirim. Lütfen tavsiye!

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

En iyi cevabı

1

Kodunuzda ve sonuç olarak istek gövdenizde birkaç değişiklik yapmanız gerekecektir. İlk güncelleme OneOfMoiChangeValue birkaç Jackson ek açıklamasıyla, adlandırılmış bir özelliğe dayalı olarak farklı alt türlerin nasıl işleneceğini bilebilir 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 {

}

Bu, artık ihtiyacınız olmadığı anlamına gelir operation mülkiyet 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.
}

Bunun yerine, diğer tüm özelliklerin yanı sıra gönderilmelidir. OneOfMoiChangeValue, yani aşağıdaki satırlar boyunca bir şey:

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

Bu iyi görünüyor. Deneyeyim de seni güncelleyeyim.
SuryaN

Merhaba @ João, şimdi istek gövdesini değiştiremeyeceğimi ve Req Gövdesi standart format olarak kabul edildiğinden ve onu manipüle etme iznine sahip olmadığından 'değer' özniteliğinin içine fazladan 'işlem' alanını ekleyemeyeceğimi öğrendim. Yani istek gövdesine fazladan alan eklemeden bunu yapabilir miyiz?
SuryaN

Farkında olduğumdan değil. Tek seçenek özel bir serileştirici olabilir. İnsanların yazılımın taşa yerleştirilmiş bir şey olduğunu ve değişikliklerin hiçbir şekilde yapılamayacağını düşünmelerini gerçekten çok seviyorum (bunun sizin kararınız olmadığını biliyorum ;) ).
João Dias

Evet katılıyorum sana. :) Bu durumda özel seri hale getiriciyi kullanmak zorundayız. Bunu yeni duyuyorum. Yapabiliyorsam yazmaya çalışıyorum.
SuryaN

Merhaba @ João Dias, söylediğin gibi özel bir seri hale getirici yazdım ve işe yaradı. Ayrıca, cevapta sahip olduğunuz öneri, çoğu durumda işe yarayacaktır, çünkü genellikle json'daki ekstra alanı geçebiliriz. Çözümünüzü doğru olduğu gibi kabul ediyorum. Yardımlarınız için teşekkürler çözüm için :)
SuryaN

Sen hoş geldiniz! Ayrıca özel seri hale getiricinizi yanıt olarak eklemeyi düşünün ve kabul edin ;)
João Dias

Diğer dillerde

Bu sayfa diğer dillerde

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