1. ホーム
  2. java

[解決済み] java.lang.ClassCastException: java.util.LinkedHashMap は com.testing.models.Account にキャストできない。

2022-02-28 18:53:26

質問

以下のようなエラーが発生します。

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account

を以下のコードに置き換えます。

final int expectedId = 1;

Test newTest = create();

int expectedResponseCode = Response.SC_OK;

ArrayList<Account> account = given().when().expect().statusCode(expectedResponseCode)
    .get("accounts/" + newTest.id() + "/users")
    .as(ArrayList.class);
assertThat(account.get(0).getId()).isEqualTo(expectedId);

ができない理由はあるのでしょうか? get(0) ?

解決方法は?

この問題はJacksonに起因しています。どのクラスにデシリアライズするかについて十分な情報を持っていない場合、それは LinkedHashMap .

の要素タイプをJacksonに通知していないためです。 ArrayList にデシリアライズしたいことがわからないのです。 ArrayListAccount s. そのため、デフォルトにフォールバックしてしまいます。

代わりに、おそらく as(JsonNode.class) を処理し、その後に ObjectMapper を、レスト・アシュアードが可能にするよりもリッチな方法で使用することができます。 こんな感じです。

ObjectMapper mapper = new ObjectMapper();

JsonNode accounts = given().when().expect().statusCode(expectedResponseCode)
    .get("accounts/" + newClub.getOwner().getCustId() + "/clubs")
    .as(JsonNode.class);


//Jackson's use of generics here are completely unsafe, but that's another issue
List<Account> accountList = mapper.convertValue(
    accounts, 
    new TypeReference<List<Account>>(){}
);

assertThat(accountList.get(0).getId()).isEqualTo(expectedId);