Ikatan data Jackson yang lebih cepatxml MismatchedInputException

Saya menggunakan com.fasterxml.jackson.databind dalam aplikasi booting pegas. Saat saya mengirim permintaan ke titik akhir, saya menerima pengecualian berikut:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of 
org.pacakge.domain.controller.Mycontroller (although at least one Creator exists): cannot
deserialize from Object value (no delegate- or property-based Creator)\n at 
[Source: (PushbackInputStream); line: 2, column: 3]  Is the body of the request formatted correctly?

Pengontrol saya memproses badan permintaan yang memiliki struktur berikut:

{
  "portalId": 123,
  "objectType": "TYPE",
  "objectTypeId": "0-3",
  "objectId": 123,
  "properties": { ... }
}

Satu-satunya properti yang saya butuhkan adalah objectId. Saya telah membangun sebuah kelas untuk memproses objek ini seperti:

@lombok.Value
private static class MyObject {
  @JsonAlias("objectId")
  private final String dealId;
} 

Saya telah merancang pengontrol yang terlihat seperti ini

@Slf4j
@RestController
@RequestMapping(path = "/entrypoint")
public class MyController {
   @Autowired
   public MyController(){}
   /**
   * REST endpoint handles MyObject
   */
  @PostMapping(value = "/endpoint")
  public void handleRequest(
      @Valid @RequestBody MyObject command
      ) {
          log.debug(command.getDealId());
   }
   @lombok.Value
   private static class MyObject {
     @JsonAlias("objectId")
     private final String dealId;
   } 
}

Yang menarik dari masalah ini adalah permintaan saya diproses dengan baik jika saya mengubah MyObject ke struktur berikut:

@lombok.Value
  private static class MyObject {
    @JsonAlias("objectId")
    private final String dealId;
    private final JSONObject properties;  // TODO we shouldn't need this.  Fix.
  }

Sepertinya saya tidak tahu apa masalahnya. Saya ingin sekali bantuan untuk masalah ini. Mungkin ada anotasi yang saya lewatkan? Saya berharap orang lain pernah mengalami masalah ini. Saya belum menemukan informasi apa pun tentangnya hanya dengan mencari di web.


person Evan Gertis    schedule 17.04.2020    source sumber


Jawaban (1)


Saya menambahkan baris berikut ke lombok.config di direktori root proyek:

lombok.anyConstructor.addConstructorProperties=true

Dan setelah itu berhasil melakukan deserialize JSON Anda menggunakan DTO ini menggunakan anotasi @JsonIgnoreProperties:

@Value
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyObject {
    @JsonProperty("objectId")
    String dealId;
}
person Alex Rudenko    schedule 17.04.2020
comment
Hai Alex, jawaban Anda berhasil. Selain itu, saya juga menemukan cara lain untuk memperbaikinya. Sepertinya masalah teratasi jika saya menambahkan konstruktor default dan menyetel dealId ke nol. Kemudian tambahkan konstruktor lain yang menggunakan dealId sebagai parameter dan this.dealId ke parameter. Terima kasih! - person Evan Gertis; 17.04.2020
comment
Ada cara lain untuk mengurangi kode POJO, coba lihat! :) - person Alex Rudenko; 17.04.2020