'@RequiredArgsConstructor' и 'MismatchedInputException: невозможно создать экземпляр' - PullRequest
0 голосов
/ 05 мая 2020

У меня есть несколько объектов DTO, которые все выглядят следующим образом:

@Getter
@RequiredArgsConstructor
public class SomeDTO {
  private final String someProperty;
}

Эти объекты DTO принимаются различными RestController методами:

@RestController
public void InvitationController {

  @PostMapping
  public String create(@RequestBody InvitationCreationDTO invitationCreationDTO) {
    // some logic
    return "ok";
  }

}

У Джексона нет проблем десериализация json в эти классы, за исключением следующего:

@Getter
@RequiredArgsConstructor
public class InvitationCreationDTO {
  private final String emailAddress;
}

Когда Джексон пытается десериализовать следующие JSON:

{ "emailAddress" : "some@email.com" }

Выдается эта ошибка:

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `my.package.InvitationCreationDTO` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (PushbackInputStream); line: 1, column: 2]
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) ~[jackson-databind-2.10.2.jar:2.10.2]
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1429) ~[jackson-databind-2.10.2.jar:2.10.2]
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1059) ~[jackson-databind-2.10.2.jar:2.10.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297) ~[jackson-databind-2.10.2.jar:2.10.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326) ~[jackson-databind-2.10.2.jar:2.10.2]
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159) ~[jackson-databind-2.10.2.jar:2.10.2]
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202) ~[jackson-databind-2.10.2.jar:2.10.2]
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3258) ~[jackson-databind-2.10.2.jar:2.10.2]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:239) ~[spring-web-5.2.3.RELEASE.jar:5.2.3.RELEASE]
    ... 86 common frames omitted

Это работает, однако, когда я удаляю @RequiredArgsConstructor и создаю его сам:

@Getter
public class InvitationCreationDTO {
  private final String emailAddress;

  @JsonCreator
  public InvitationCreationDTO(String emailAddress) {
    this.emailAddress = emailAddress;
  }
}

Зачем это нужно этому классу, но другие мои классы DTO (которые имеют такие же формат) нет?

1 Ответ

0 голосов
/ 05 мая 2020

Попробуйте добавить @NoArgsConstructor в свой InvitationCreationDTO класс

@Getter
@NoArgsConstructor
@RequiredArgsConstructor
public class InvitationCreationDTO {
  private final String emailAddress;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...