Kotlin Spring Boot 验证不起作用

Posted

技术标签:

【中文标题】Kotlin Spring Boot 验证不起作用【英文标题】:Kotlin spring boot validation does not work 【发布时间】:2020-11-22 18:13:02 【问题描述】:

当我使用空电子邮件向 /register 用户发出 POST 请求时,我希望它会说“嘿,您的电子邮件字段中有空值”,但由于 user.email!! 语句,它会在保存步骤中抛出 NPE。 当我用这样的错误电子邮件发送 json 时:


  "email": "wrongEmailAddress",
  "username": "username",
  "phoneNumber": "+7 909 909 9009",
  "password": "234adfg24",
  "role": "USER"

完美的通过了这个约束注解:

@Email
@Pattern(regexp = ".+@.+\\..+", message = "Please provide a valid email address")
@Target(
        AnnotationTarget.FIELD,
        AnnotationTarget.FUNCTION,
        AnnotationTarget.ANNOTATION_CLASS,
        AnnotationTarget.PROPERTY,
        AnnotationTarget.PROPERTY_GETTER)
@Retention(AnnotationRetention.RUNTIME)
@Constraint(validatedBy = [])
@MustBeDocumented
annotation class ValidEmail(
        val message: String = "Please provide a valid email address",
        val groups: Array<KClass<out Any>> = [],
        val payload: Array<KClass<out Payload>> = []
)

request screenshot

为什么验证不起作用?

控制器类:

@RestController
class UserController(
        @Autowired val userService: UserService) 

    @PostMapping(
            path=["/register"],
            consumes=["application/json"],
            produces=["application/json"])
    fun registerNewUser(
            @Valid @RequestBody user: User): UserDTO 
        user.encryptPassword()
        userService.registerNewUser(user)
        return UserDTO(user)
    

用户类别:

@Entity
class User(
        @get:NotNull @field:ValidEmail @Column(unique = true)
        var email: String? = null,
        @get:NotNull @Column(unique = true)
        var username: String? = null,
        @get:NotNull @field:ValidPhoneNumber @Column(unique = true)
        var phoneNumber: String? = null,
        @get:NotNull @field:ValidPassword
        var password: String? = null,
        @get:NotNull
        var role: Role? = null,

        var address: String? = null
) : BaseEntity()

    fun encryptPassword() 
        password = BCryptPasswordEncoder().encode(password)
    


@MappedSuperclass
open class BaseEntity(
        @Id @NotNull @GeneratedValue(generator = "UUID")
        @GenericGenerator(name="UUID", strategy = "org.hibernate.id.UUIDGenerator")
        open val id: UUID? = null)

我试过了。我尝试在@ValidEmail、@get:ValidEmail、@field:ValidEmail(kotlin data class + bean validation jsr 303、https://stackoverrun.com/ru/q/9883168 和其他来源)之间进行更改,尝试用 java 重写所有内容。没有任何效果。 PhoneNumberValidator 通过了所有单元测试,但约束 @ValidPhoneNumber 也不起作用。甚至没有一个约束起作用。 感谢您的任何建议。

【问题讨论】:

在字段上直接使用@Pattern @User-Upvotedon'tsayThanks 它不能解决任何其他约束的问题。 【参考方案1】:

用@Validated 标记你的restcontroller。

【讨论】:

它不起作用。此注释用于允许验证请求参数和路径变量(reflectoring.io/bean-validation-with-spring-boot)我有另一个带有 bean 验证的 java 项目,在没有 @Validated 的情况下一切正常 您是否尝试在属性上添加 rhe @Valid 注释? 如果你的意思是像我提到的那样对请求参数和路径变量进行验证,答案是否定的,但即使是类属性上的 @NotNull 注释也不起作用 你使用的是哪个 Spring Boot 版本? 2.3.2.RELEASE。在我用 gradle 重新创建项目后问题解决了,everythink 现在可以工作了,以前使用过 maven。顺便说一句,这是我的错还是 maven 真的是一件坏事?

以上是关于Kotlin Spring Boot 验证不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Kotlin 项目在 Eclipse 中不起作用

JPA 自动完成功能在 Intellij spring-boot kotlin 项目中不起作用

Spring Boot thymeleaf 验证不起作用

对于其余请求,验证在 Spring Boot 中不起作用

Spring Boot JPA 连接验证不起作用

针对 Spring Boot API 的 Android 身份验证不起作用