Fasterxml Jackson databind ไม่ตรงกันInputException

ฉันใช้ com.fasterxml.jackson.databind ในแอปพลิเคชันสปริงบูต เมื่อฉันส่งคำขอไปยังปลายทางของฉัน ฉันได้รับข้อยกเว้นต่อไปนี้:

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?

ตัวควบคุมของฉันประมวลผลเนื้อหาคำขอที่มีโครงสร้างดังต่อไปนี้:

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

คุณสมบัติเดียวที่ฉันต้องการคือ objectId ฉันได้สร้างคลาสเพื่อประมวลผลวัตถุนี้ดังนี้:

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

ฉันได้ออกแบบคอนโทรลเลอร์ที่มีลักษณะเช่นนี้

@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;
   } 
}

สิ่งที่น่าสนใจเกี่ยวกับปัญหานี้ก็คือคำขอของฉันได้รับการประมวลผลได้ดีหากฉันเปลี่ยน MyObject เป็นโครงสร้างต่อไปนี้:

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

ฉันไม่สามารถเข้าใจได้ว่าปัญหาคืออะไร ฉันชอบความช่วยเหลือเกี่ยวกับปัญหานี้ อาจมีคำอธิบายประกอบที่ฉันหายไป? ฉันหวังว่าคนอื่นประสบปัญหานี้ ฉันไม่พบข้อมูลใด ๆ เพียงแค่ค้นหาในเว็บ


person Evan Gertis    schedule 17.04.2020    source แหล่งที่มา


คำตอบ (1)


ฉันเพิ่มบรรทัดต่อไปนี้ใน lombok.config ในไดเรกทอรีรากของโครงการ:

lombok.anyConstructor.addConstructorProperties=true

และหลังจากนั้นจัดการดีซีเรียลไลซ์ JSON ของคุณโดยใช้ DTO นี้โดยใช้คำอธิบายประกอบ @JsonIgnoreProperties:

@Value
@JsonIgnoreProperties(ignoreUnknown = true)
public class MyObject {
    @JsonProperty("objectId")
    String dealId;
}
person Alex Rudenko    schedule 17.04.2020
comment
สวัสดีอเล็กซ์ คำตอบของคุณใช้งานได้ นอกจากนี้ฉันยังหาวิธีอื่นในการแก้ไขด้วย ดูเหมือนว่าปัญหาจะได้รับการแก้ไขหากฉันเพิ่มตัวสร้างเริ่มต้นและตั้งค่า dealId เป็น null จากนั้นเพิ่มตัวสร้างอื่นที่ใช้ dealId เป็นพารามิเตอร์และ this.dealId ไปยังพารามิเตอร์ ขอบคุณ! - person Evan Gertis; 17.04.2020
comment
มีอีกวิธีหนึ่งในการลดรหัสของ POJO ลองดูสิ! :) - person Alex Rudenko; 17.04.2020