validator length example bean annotation java validation annotations constraints

java - length - Campo de variable en una anotación de restricción



javax.validation example (3)

Necesito crear una anotación de restricción personalizada que pueda acceder al valor de otro campo de mi bean. Usaré esta anotación para validar el campo porque depende del valor de la otra, pero la forma en que la defino, el compilador dice "El valor para el atributo de anotación" de mi campo "debe ser una expresión constante".

Lo he definido de esta manera:

@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=EqualsFieldValidator.class) @Documented public @interface EqualsField { public String field(); String message() default "{com.myCom.annotations.EqualsField.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } public class EqualsFieldValidator implements ConstraintValidator<EqualsField, String>{ private EqualsField equalsField; @Override public void initialize(EqualsField equalsField) { this.equalsField = equalsField; } @Override public boolean isValid(String thisField, ConstraintValidatorContext arg1) { //my validation } }

y en mi bean quiero algo como esto:

public class MyBean{ private String field1; @EqualsField(field=field1) private String field2; }

¿Hay alguna manera de definir la anotación para que el valor del campo pueda ser una variable?

Gracias


Como el compilador dijo que las anotaciones deben ser constantes (es decir, puedes determinar el valor en tiempo de compilación). Ahora bien, si estoy adivinando correctamente, parece que estás usando esta anotación para indicar que los valores de esos campos deben ser iguales cuando se ejecutan a través del es igual al validador de campo. Un enfoque que podría tomar es usar la reflexión. En lugar de intentar anotar con el valor, haga una anotación con el nombre del campo en su lugar

public class MyBean{ private String field1; @EqualsField("field1") private String field2; }

Luego, en su validador puede leer el nombre del campo y usar la reflexión para acceder a él

Object o = object.getClass().getDeclaredField(annotationValue).get(object); o == object.(field with annotation) OR o.equals(object.(field with annotation));

Dependiendo de lo que trates de hacer, es posible que necesites agregar lógica según el tipo de campo, pero sigue siendo el mismo principio general.


Lo más fácil es dar un paso atrás: la restricción / validador que ha escrito funciona en un nivel de campo, pero lo que quiere aplicar es una dependencia entre campos, es decir, una restricción de nivel de clase.

Vuelva a escribir su restricción y validador para trabajar en el nivel de clase (es decir, la anotación irá en la clase, no en el campo). De esa forma, tendrás acceso a toda la clase. En su método isValid (..), simplemente haga una obtención en ambos campos, compare y regrese apropiadamente.