#hibernate #constraints #hibernate-validator
#зимовать #ограничения #спящий режим-валидатор
Вопрос:
Я пытаюсь создать пользовательское противопоказание с помощью валидатора Hibernate. Если я использую стандартный, такой как @Size, он работает хорошо, и я получил сообщение об ошибке. Однако мой собственный не работает, и я не могу понять, почему.
Это мой код:
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload; @Target({ ElementType.FIELD, ElementType.PARAMETER }) @Retention(value = RetentionPolicy.RUNTIME) @Documented @Constraint(validatedBy = TestValidateur.class) public @interface ObjectValid { String message() default "test"; Classlt;?gt;[] groups() default {}; Classlt;? extends Payloadgt;[] payload() default {}; }
И:
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; public class TestValidateur implements ConstraintValidatorlt;ObjectValid , Stringgt; { public void initialize(ObjectValid constraintAnnotation) { } public boolean isValid(String NoObject, ConstraintValidatorContext ctx) { return false ; } }
@Column(name="NoObject") @ObjectValid @Size(min = 4, max = 14) public String NoObject;
И проверить правильность:
import java.io.FileNotFoundException; import java.util.Set; import javax.persistence.EntityManager; import org.hibernate.mapping.Component; import org.hibernate.validator.HibernateValidator; import jakarta.validation.ConstraintViolation; import jakarta.validation.Validation; import jakarta.validation.Validator; import jakarta.validation.ValidatorFactory; public class NoTest { private static Validator validator; public static void main(String[] args) throws FileNotFoundException, NoSuchMethodException, SecurityException { Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Object objectVerif = new Object("ss"); Setlt;ConstraintViolationlt;Objectgt;gt; validationErrors = validator.validate(objectVerif); if(!validationErrors.isEmpty()){ for(ConstraintViolationlt;Objectgt; error : validationErrors){ System.out.println(error); } } } }
If I run the app, I only receive the error message for the @Size
ConstraintViolationImpl{interpolatedMessage='la taille doit être comprise entre 4 et 14', propertyPath=NoObject, rootBeanClass=class tp03.Object, messageTemplate='{jakarta.validation.constraints.Size.message}'}
Если у кого-нибудь есть представление о том, чего мне не хватает, я был бы очень признателен
Спасибо
Проверенный объект:
import java.util.ArrayList; import java.util.Collection; import javax.persistence.*; import org.hibernate.annotations.OnDelete; import org.hibernate.annotations.OnDeleteAction; import jakarta.validation.constraints.Min; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Null; import jakarta.validation.constraints.Size; @Entity @Table(name="object",indexes = { @Index(name="primary",columnList = "idObject")}) public class Object { @Id @GeneratedValue @Column(name="idObject") private int idObject; public int getidObject() { {return idObject;} } public void SetidObject(int idObject) { this.idObject=idObject; } @Column(name="NoObject") @ObjectValid @Size(min = 4, max = 14) public String NoObject; public String getNoObject() { {return NoObject;} } public void SetNoObject(String NoObject) { this.NoObject=NoObject; } public Object(String NoObject) {this.NoObject=NoObject; } }
Комментарии:
1. Привет, просто для полноты картины, не могли бы вы поделиться большей частью вашего проверенного объекта, чтобы можно было попытаться воспроизвести вашу проблему?
2. Спасибо за комментарий, я добавил больше информации
Ответ №1:
Проблема здесь в том, что javax.validation.Constraint
он использовался для определения пользовательского ограничения, но jakarta.validation.Validator
используется для проведения проверки, которая затем проверяет только jakarta.validation.Constraint
s.
При изменении импорта с javax
на jakarta
в интерфейсе ObjectValid
ограничений и TestValidateur
классе оба ограничения проверяются правильно.