#9 [SpringBoot/KotlinでBFF]2つ目の外部APIを追加

Repository層に2つ目の外部API(ユーザー情報を取得)用のクラスを追加してController層で呼び出すまでを実装。複数の異なる外部APIを呼び出すのはService層でハンドリングするが良いけど、それは後からやるとして、ここではひとまずController層で呼び出してみる。

Model追加

import java.util.*

data class User (
val userId: Int? = null,
val userName: String? = null,
val created: Date? = null
)


Repositoryクラス追加

@Repository
class UserRepository(restTemplateBuilder: RestTemplateBuilder) {

private var restTemplate: RestTemplate? = null

init {
restTemplate = restTemplateBuilder.build()
}

fun getUser(userId: Int): User? {
val uri = "http://localhost:50001/users/$userId"

return restTemplate?.getForObject(uri, User::class)
}
}

RepositoryクラスのUnitテスト追加

@RestClientTest(UserRepository::class)
@DisplayName("UserRepository")
internal class UserRepositoryTest {

@Autowired
lateinit var userRepository: UserRepository

@Autowired
lateinit var mockServer: MockRestServiceServer

@Autowired
lateinit var objectMapper: ObjectMapper

@Nested
@DisplayName("getUser")
inner class GetTask {

@Test
@DisplayName("should return user data when userRepository call to GET user to external Task-api with user id.")
fun getUser() {
val user = User(1, "タスクの管理者A", Date())
mockServer.expect(MockRestRequestMatchers.requestTo("http://localhost:50001/users/1"))
.andRespond(MockRestResponseCreators.withSuccess(objectMapper.writeValueAsString(user), MediaType.APPLICATION_JSON))

val actual = userRepository.getUser(1) ?: User()

assertEquals(1, actual.userId)
assertEquals("タスクの管理者A", actual.userName)
assertNotNull(actual.created)
}
}
}

Controller層で呼び出す

    @GetMapping("/{taskId}")
@ResponseBody
@ResponseStatus(HttpStatus.OK)
fun getTask(@PathVariable("taskId") taskId: Int): Task {

val task = taskRepository.getTask(taskId)
println(task)

val user = userRepository.getUser(1)
println(user)

return Task(
taskId = taskId,
title = "タスクのタイトル",
description = "タスクの詳細説明",
userName = "タスク担当者A")
}
}

実行結果
サービス、外部API用のサービスを起動して呼び出してみてる。
コンソールに取得結果が表示されているのを確認。
http://localhost:8080/tasks/12345

Task(taskId=12345, title=タスクのタイトル, description=タスクの詳細説明, created=Sun Sep 27 15:45:40 JST 2020)
User(userId=1, userName=タスクの管理者A, created=Sun Sep 27 15:45:40 JST 2020)

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

コメントを残す

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

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