[SpringBoot/KotlinでBFF]”Error while extracting response for type [] and content type [application/json]”の解決

RestTemplateのunitTestを作成して実行した時に以下のようなJSON parse errorが発生した場合の対応

org.springframework.web.client.RestClientException: Error while extracting response for type [class com.example.bffsample.model.externalapi.Task] and content type [application/json]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized token 'Task': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Task': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
 at [Source: (ByteArrayInputStream); line: 1, column: 6]

対応
WithSuccessで指定するMockのレスポンスが正しくなくて実行時にJSON parseエラーとなってたようなので、ObjectMapperを使用してJSON形式のStringをレスポンスとして返すように修正して解決。

修正前はObjectの内容をStringとして出力してしまっていた感じ。
修正前:Task(taskId=12345, title=タスクのタイトル, description=タスクの詳細説明, created=Tue Sep 22 12:49:27 JST 2020)
修正後:{“taskId”:12345,”title”:”タスクのタイトル”,”description”:”タスクの詳細説明”,”created”:”2020-09-22T03:49:27.768+00:00″}

AsIs

@RestClientTest(TaskRepository::class)
internal class TaskRepositoryTest {

    @Autowired
    lateinit var taskRepository: TaskRepository

    @Autowired
    lateinit var mockServer: MockRestServiceServer

    @Test
    fun getTask() {
        mockServer.expect(requestTo("http://localhost:50000/tasks/12345"))
                .andRespond(withSuccess(Task(
                        12345,
                        "タスクのタイトル",
                        "タスクの詳細説明",
                        Date()).toString(), MediaType.APPLICATION_JSON))

        this.taskRepository.getTask(12345)
    }
}

ToBe

@RestClientTest(TaskRepository::class)
internal class TaskRepositoryTest {

    @Autowired
    lateinit var taskRepository: TaskRepository

    @Autowired
    lateinit var mockServer: MockRestServiceServer

    @Autowired
    lateinit var objectMapper: ObjectMapper

    @Test
    fun getTask() {
        val task = Task(
                12345,
                "タスクのタイトル",
                "タスクの詳細説明",
                Date())

        mockServer.expect(requestTo("http://localhost:50000/tasks/12345"))
                .andRespond(withSuccess(objectMapper.writeValueAsString(task), MediaType.APPLICATION_JSON))

        this.taskRepository.getTask(12345)
    }
}

コード
https://github.com/little-engineer/bff-sample/pull/9

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
little
15年以上プログラマーをしているエンジニアです。Kotlin, Java, Python, C++を使用したServerSideの開発に携わってきました。とりあえずやってみるスタイルで記事を更新していきます。