Kotlin проверка весенней загрузки не работает - PullRequest
0 голосов
/ 02 августа 2020

Когда я делаю POST-запрос / регистрируюсь у пользователя с нулевым адресом электронной почты, я ожидаю, что он скажет что-то «эй, у вас пустое поле в электронном письме», но он выдает NPE на этапе сохранения из-за оператора user.email!!. Когда я отправляю 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 класс данных + проверка bean jsr 303 , https://stackoverrun.com/ru/q/9883168 и другие источники), попробовал переписать все в java. Ничего не работает. PhoneNumberValidator проходит все модульные тесты, но ограничение @ValidPhoneNumber тоже не работает. Ни одно ограничение не работает. Спасибо за любые предложения.

1 Ответ

1 голос
/ 13 августа 2020

Отметьте свой restcontroller с помощью @ Validated.

...