web-dev-qa-db-ja.com

「クラス名」のインスタンスを作成できません(少なくともCreatorに存在します)

私はリクエストペイロードとして使用している次のクラスを持っています:

public class SampleRequest {

    private String fromDate;
    private String toDate;

    // Getters and setters removed for brevity.
}

私は以下のこのリソースでそれを使用しようとしています(物事が起こるのを確認するために画面に印刷するだけです):

@PostMapping("/getBySignatureOne")
public ResponseEntity<?> getRequestInfo(@Valid @RequestBody SampleRequest signatureOneRequest) {

    System.out.println(signatureOneRequest.getToDate);
    System.out.println(signatureOneRequest.getFromDate);
}

これは私が送信したJSONリクエストです:

{
    "fromDate":"2019-03-09",
    "toDate":"2019-03-10"
}

これは私が得るエラーです:

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.test.app.payload.SampleRequest` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('fromDate'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.test.app.payload.SampleRequest` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('fromDate')
 at [Source: (PushbackInputStream); line: 1, column: 2]]

ここで何が問題になっているのかを知りたい、コンストラクタの問題、またはどこかに注釈が欠けているのではないかと思いますが、正直にどこが間違っているのかわかりません。

3
Slippy

すべてのパラメーターを持つコンストラクターが必要です。

public SampleRequest(String fromDate, String toDate) {

    this.fromDate = fromDate;
    this.toDate = toDate;

}

または@AllArgsConstructorまたは@Dataロンボクから。

3
Andronicus

こんにちは、文字列(fromDateおよびtoDate)を日付に解析できないため、カスタムデシリアライザーを記述する必要があります。

{"fromDate": "2019-03-09"、 "toDate": "2019-03-10"}

このリンクには、カスタムデシリアライザを使い始めるためのチュートリアルがあります https://www.baeldung.com/jackson-deserialization

デシリアライザはこのように書くことができます。

public class CustomDateDeserializer extends StdDeserializer<Date> {

private static SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

public CustomDateDeserializer() {
    this(null);
}

public CustomDateDeserializer(Class<?> vc) {
    super(vc);
}

@Override
public Date deserialize(JsonParser jsonparser, DeserializationContext context) throws IOException {
    String date = jsonparser.getText();
    try {
        return formatter.parse(date);
    } catch (ParseException e) {
        throw new RuntimeException(e);
    }
}}

このようにクラス自体にデシリアライザを登録できます。

@JsonDeserialize(using = ItemDeserializer.class)
public class Item {  ...}

または、このようにカスタムデシリアライザを手動で登録することもできます

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Item.class, new ItemDeserializer());
mapper.registerModule(module);
1
dextermini