【发布时间】: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>> = []
)
为什么验证不起作用?
控制器类:
@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 它不能解决任何其他约束的问题。
标签: java spring spring-boot validation kotlin