【问题标题】:Spring annotation @Validated not working in kotlin class, same java code worksSpring注解@Validated在kotlin类中不起作用,相同的java代码起作用
【发布时间】:2020-01-08 14:02:09
【问题描述】:

我有 kotlin 获取请求。 验证不起作用,可以或多或少地指定星期几验证限制

@RestController
@Validated
open class GetCrab {
    @GetMapping("/v1/get")
open fun getNameOfDayByNumber(@RequestParam dayOfWeek: @Min(1) @Max(7) Int?): String {
        return "ok"
    }
}

在同一个java代码验证工作

@RestController
@Validated
public class GetCrab {

    @GetMapping("/v1/get")
    public String getNameOfDayByNumber(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) {

        return "ok";
    }
}

验证工作时的 Java 代码:请求:

http://localhost:12722/v1/get?dayOfWeek=100

响应->

{
"errors": [
    {
        "code": "INTERNAL_SERVER_ERROR",
        "details": "getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7"
    }
]

}

Kotlin 代码,请求http://localhost:12722/v1/get?dayOfWeek=100

回复:

ok

【问题讨论】:

  • 你可能应该添加一些关于你如何调用你的代码以及你为非工作代码返回的错误/响应的细节。
  • 好吧,所以你可能应该说这段代码是如何提供服务的,就像我在 Tomcat 中运行的一样,当我执行如下所示的 GET 请求时,我的 Java 代码工作正常,但是当我请求Kotlin 代码我得到一个看起来像 X 的响应。把它放在你的问题中,而不是在这里的 cmets 中。
  • 我正在添加示例请求和响应

标签: java spring-boot validation kotlin


【解决方案1】:

方法也请使用open修饰符。

例如请尝试代码:

@RestController
@Validated
open class GetCrab {
    @GetMapping("/v1/get")
    open fun getNameOfDayByNumber(@RequestParam dayOfWeek: @Min(1) @Max(7) Int?): String {
        return "ok"
    }
}

类和方法都应该是open(在Java 术语中——它们都不应该是最终的)because of Spring proxy logic。来自链接的文章:Spring 尝试继承您的类,因为有时您可以从 @Autowired 参数请求准确的类。

默认所有类和方法are not final in Java。但是 Kotlin 类/方法 are final by default,因此您需要在它们之前放置 open 关键字才能覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 2015-09-03
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多