使用的环境

  • kotlin 1.5.31
  • IDEA: 2021.2.3

事情经过

我使用javax.validation.constraints.*的注解作用到一个kotlin的data class上,测试接口的时候并没有按照正常的注解规则来,代码如下:

data class RedirectParam(
        var cycle: Int? = 0,
        @URL
        var to: String
) : HttpToolParams

我传入的RedirectParam#to是一个 xxx://XXX 按照@URL的规则应该会抛出一个BindException,结果并没有。

解决方法

使用IDEA自带的反编译工具发现编译的代码只写到了构造器参数上,而不是属性上,因此注解加上@field:就可以正常执行

data class RedirectParam(
        var cycle: Int? = 0,
        @field:URL
        var to: String
) : HttpToolParams

小记

data class 构造器上标记的注解默认只会标记到构造器参数上, 更高版本似乎是生成了一个静态方法,注解放到了那个静态方法上,正常的java框架无法正常获取注解,必须加上field前缀或给get()