Привязка данных Fasterxml Джексона MismatchedInputException

Я использую 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