当前位置: 首页 > 知识库问答 >
问题:

kotlin和@Valid Spring注释

宗政元青
2023-03-14

我有一个实体:

class SomeInfo(
        @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) var value: String) {
    var id: Long? = null
}

和控制器方法:

@RequestMapping(value = "/some-info", method = RequestMethod.POST)
public Id create(@Valid @RequestBody SomeInfo someInfo) {
       ...
    }

@Valid批注不起作用。

看起来Spring需要一个默认的无参数构造函数,上面的代码看起来很丑(但是可以工作),如下所示:

class SomeInfo() {

    constructor(value: String) {
            this.value = value
        }

        @NotNull @Pattern(regexp = Constraints.EMAIL_REGEX) 
        lateinit var value: String

        var id: Long? = null
    }

有什么好的练习可以让它不那么罗嗦吗?

谢谢

共有3个答案

戚勇
2023-03-14

如果使用IntelliJ将Java转换为Kotlin,Spring控制器方法中的@Valid注释可能最终附加到类型,而不是变量。这将破坏验证。

例如,转换可能导致

@PostMapping
public Id create(@RequestBody someInfo: @Valid SomeInfo) {
    ...
}

这不是验证。@Valid必须移动到这样的变量

@PostMapping
public Id create(@RequestBody @Valid someInfo: SomeInfo) {
    ...
}
罗波鸿
2023-03-14

作为 Michal 答案的替代方法,注释 getter 也有效。

class SomeInfo(
    @get:NotNull
    @get:Pattern(regexp = Constraints.EMAIL_REGEX)
    var value: String
) {
    var id: Long? = null
}

恼人的部分是,不使用@get:或@field:将注释构造函数参数。这仍然是有效的kotlin代码(因此不会出现错误)。只是在这些用例中没用。

狄望
2023-03-14

似乎Spring需要将这些注释应用于字段。但是Kotlin会将这些注释应用于构造函数参数。应用批注时使用< code>field:说明符,使其应用于字段。下面的代码应该很适合你。

class SomeInfo(
    @field:NotNull
    @field:Pattern(regexp = Constraints.EMAIL_REGEX)
    var value: String
) {
    var id: Long? = null
}
 类似资料:
  • 若要使用2.3.0之前的Android注释,可以执行以下操作: 要使用Kotlin,您可以使用而不是(链接)。 所以我清理并重建了这个项目。似乎annotations没有为MainActivity生成下划线文件。有道理但我不知道为什么或者怎么解决。

  • 我看到一个例子解释了Kotlin JVM的KATP,它正在工作。 我想知道它是否支持Kotlin JS?有什么例子吗?

  • 我正在试验Micronaut和Kotlin。 我有一个HibernateJPA连接,它工作得很好,但是,在为它创建RESTAPI时,我想从列表序列化中排除一些属性。 因此,以下是我所做的: 域类: View1和View2并不有趣,因为根据文档,它们实际上是空类。 现在,在控制器中,我这样做: 希望得到一些合作,但我得到的是: 在应用程序中。yml、json视图应正确设置为: 有线索吗?

  • 静态编程语言允许注释表达式。然而,尚不清楚这些注释如何有用以及如何使用它们。 假设在下面的示例中,我想检查一下,该字符串包含@MyExpr注释中指定的数字。这能实现吗?如何实现?

  • 在添加com.google.dagger:dagger-android-support依赖项后,我得到了这个gradle错误。 这是我的构建的一部分

  • 我是匕首2和科特林的新手。获取未初始化的延迟属性。 我有一个模块,它有几个@Provides方法,但其中一个类无法创建使用@Inject和lateinit的对象。 登录服务以“LoginAPI”为参数,工作正常,但我希望所有与登录相关的API都使用相同的服务。还有一个与API相关的“LoginWithOrgAPI”。 现在我的需求是在LoginService类中获取任何需要时的API对象。所以我尝