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

kotlin数据类+bean验证jsr 303

孙成益
2023-03-14

我试图让Kotlin在spring-data-rest项目上使用JSR303验证。

给定以下数据类声明:

@Entity data class User(
    @Id 
    @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
    var id: Long? = null,

    @Size(min=5, max=15)
    val name: String
)

提前感谢您的帮助!

共有1个答案

计均
2023-03-14

您需要使用注释use-site目标,因为当有多个可用选项时,构造函数中声明的属性的默认目标是构造函数参数上的注释,而不是getter(兼容JavaBeans的主机将看到getter)。此外,在这里使用data类可能也不合适(请参见末尾的注释)。

@Entity data class User(
    @Id
    @GeneratedValue(strategy = javax.persistence.GenerationType.AUTO)
    var id: Long? = null,

    @get:Size(min=5, max=15) // added annotation use-site target here
    val name: String
)

Kotlin文档中的property目标看起来可能很诱人,但它只能从Kotlin而不是Java中看到。通常get会起作用,并且在beanset上不需要它。

文件将流程描述为:

  • 参数
  • 属性
  • 字段

@size批注是:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})

因此,由于parameter是一个有效的目标,并且有多个目标可用(参数、字段、方法[get/set]),所以它选择了不是您想要的parameter。因此,JavaBean主机要查看属性,它将查找getter(属性由getter/setter定义,而不是由backking字段定义)。

java prettyprint-override">public class Book {
    private String title;
    private String description;

    // ...

    @NotEmpty(groups={FirstLevelCheck.class, Default.class})
    @Size(max=30)
    public String getTitle() {
        return title;
    }

    // ...
}

注意:正如其他人的注意所提到的,如果实体使用自动生成的ID,您可能应该考虑不为它们使用data类,因为新对象和检索的对象不存在data类;而data类将生成equalshashcode以包含所有字段,包括不应该包含的字段。您可以从Hibernate文档中阅读有关这方面的指导。

 类似资料:
  • 这没有任何影响。有什么想法吗? 我用一个示例项目创建了一个存储库来再现这个案例:https://github.com/mduesterhoeft/bean-validation-container-constraints

  • 我使用Jersey 2.19来实现REST API,但是我很难让资源验证像我预期的那样工作。 我的资源是这样的。 当我发出以下cURL请求时: 我在终端窗口中得到以下响应: 也就是说,的值是,正如Java EE教程中定义的那样,不会引发异常。

  • 这是用Kotlin编写的User类: 这就是测试: 无效的角色映射为NULL。 这里有一个示例项目,以防您想尝试一些东西。

  • 我正在尝试使用自定义Bean验证来验证应该大于零的数值,但问题是使用如下单个自定义验证器来验证任何数值:整数、浮点数、双......: 整数int; @PositiveNumber双倍双; 这可能吗?

  • 我有一个数据类(如下所示) 在下面给出的另一个函数中,我将其作为参数调用 如何直接在kotlin中检查请求是否不为null?