【问题标题】:spring application in kotlin behaving wierdlykotlin 中的 spring 应用程序行为怪异
【发布时间】:2020-05-05 02:41:13
【问题描述】:

我对 Spring + Kotlin 完全陌生,正在尝试编写一个简单的服务器。我正在尝试编写一个应用服务器从客户端接收请求并将请求发送到另一台服务器的可执行示例代码,该服务器将返回结果,应用服务器将该结果返回给客户端。

我在 localhost:9000 上绑定了服务器,当我将请求发送到 localhost:9000/music?user=whatever 时,我首先得到了我期望的结果,如下所示。

[
    "Music(Genre=Rock, Mood=[Joyful, Depressed])"
]

但是,再次发送相同的请求(使用邮递员),我得到了[] 作为返回。我无法理解这种行为,因为我希望每次发送请求时都会返回相同的结果。示例输入在控制器代码中硬编码为名为 sampleList 的变量。我的目标是在解决此问题后通过从客户端接收此变量作为请求正文来更改此部分。

谁能解释为什么会出现这种意外行为? 提前非常感谢。代码如下所示。

package org.whatever

import org.springframework.web.bind.annotation.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response

@RestController
class MusicController {

    @GetMapping("/music")
    fun retrieveMusicInfo(@RequestParam(value = "user") user: String): MutableList<String> {
        val valList = mutableListOf<String>()

        val sampleList: List<Int> = listOf(1, 2, 3, 4)
        val sampleAmplitudes = Amplitudes(sampleList)
        MusicService.create()?.genreMoodRequest(sampleAmplitudes).enqueue(object : Callback<Music> {
            override fun onFailure(call: Call<Music>, t: Throwable) { // Whatever }
            override fun onResponse(call: Call<Music>, response: Response<Music>?) {
                val data = response?.body()?.toString()
                data?.let { valList.add(it) }
            }
        })
        return valList
    }
}

服务逻辑如下。

package org.whatever

import retrofit2.Call
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.Body
import retrofit2.http.Headers
import retrofit2.http.POST

interface MusicService {
    @Headers("accept: application/json",
            "content-type: application/json")
    @POST("/")
    fun genreMoodRequest(@Body params: Amplitudes)
        : Call<Music>

    companion object {
        fun create(): MusicService {
            val retrofit = Retrofit.Builder()
                    .baseUrl("http://localhost:5000")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build()

            return retrofit.create(MusicService::class.java)
        }
    }
}

【问题讨论】:

  • 它可能类似于接受标头不是通过邮递员发送的。是来自浏览器的第一个请求(有效的请求)吗?
  • @stringy05 不,不是。工作请求来自邮递员,以下(不工作并返回空字符串)请求也来自邮递员。
  • 这很奇怪。不确定它会有所帮助,但是如果您从工作中添加请求和响应标头,然后失败的请求可能会有一些细节

标签: spring-boot kotlin retrofit2


【解决方案1】:

问题

Retrofit enqueue() 正在异步工作。所以它不会阻塞处理请求的当前线程。

因此,线程可以在收到来自 Retrofit 客户端的响应之前完成。

解决方案

  1. 使用 spring RestTemplate 而不是 Retrofit

  2. 使用带有阻塞 API 的改造(不是 enqueue()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 2016-05-15
    • 2020-07-28
    • 2023-03-03
    相关资源
    最近更新 更多