【问题标题】:Spring Boot Content Type Error even when specified in Kotlin即使在 Kotlin 中指定时,Spring Boot 内容类型错误
【发布时间】:2021-04-15 01:11:03
【问题描述】:

我在使用 Kotlin 的 Spring Boot 中遇到问题

我有一个接受所有主要内容类型的函数,定义如下:

@PostMapping(
        value = ["/users/new"],
        consumes = [
            MediaType.APPLICATION_JSON_VALUE,
            MediaType.APPLICATION_XML_VALUE,
            MediaType.MULTIPART_FORM_DATA_VALUE,
            MediaType.APPLICATION_FORM_URLENCODED_VALUE]
    )
    fun registerNewUser(
        @RequestHeader("X-Forward-For") ipAddress: String?,
        newUser: NewUser,
        request: HttpServletRequest
    ): ResponseEntity<ObjectNode> {
        var realIPAddress = ipAddress
        if (realIPAddress == null) {
            realIPAddress = request.remoteAddr
        }
        return userService.registerUser(realIPAddress!!, newUser)
    }

这是我的 NewUser 类在 kotlin 中的定义方式

data class NewUser(val email: String?, val password: String?)

这是我在注册功能中的检查方式

if (!StringUtils.hasText(newUser.email)) {
            return responseHandler.errorResponse(
                HttpStatus.BAD_REQUEST,
                "Please provide an email address"
            )
        }

现在,当我使用邮递员甚至 axios 发送发布请求时,我不断收到错误,如下面的屏幕截图所示

只有在未提供电子邮件地址时才应显示该错误消息。但是您可以清楚地看到,电子邮件地址是在 JSON Payload 中提供的。

可能出了什么问题?

注意:这在 Content-Type 为 application/x-www-form-urlencoded 时有效,但在 Content-Type 为 application/json 时无效

【问题讨论】:

    标签: spring spring-boot spring-mvc kotlin spring-data


    【解决方案1】:

    @RequestBody 放在 newUser 参数之前以指定输入应位于 http 正文部分内。 spring中默认的函数参数被认为是url参数,可以用@RequestParam进一步澄清。

    有两种方法可以将请求参数插入到 http 请求中。一种是将请求参数附加到url的末尾,另一种是将application/x-www-form-urlencoded作为content-type的http body。

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 1970-01-01
      • 2017-11-20
      • 2018-05-15
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多