編輯:
要驗證任何一個領域都有價值,但沒有其他的,我覺得你可以在類級別使用自定義的驗證。以下是思路:
1. 您的註釋創建界面:
@Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ChoiceValidator.class)
@Documented
public @interface Choice {
String[] fields();
String message() default "{Choice.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
2. 創建的ConstraintValidator
一個實施檢查,以驗證該值在fields
裏面Choice
註釋:
public class ChoiceValidator
implements ConstraintValidator<Choice, Object> {
private List<String> fields;
@Override
public void initialize(final Choice choice) {
fields = Arrays.asList(choice.fields());
}
@Override
public boolean isValid(final Object value, final ConstraintValidatorContext ctx) {
int nonNullFieldCount = 0;
for (String field : fields) {
try {
final String fieldValue = BeanUtils.getProperty(value, field);
if (fieldValue != null) {
nonNullFieldCount++;
}
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
}
}
return nonNullFieldCount == 1;
}
}
之後,你可以使用類似於:
@Choice(fields= {"fieldOne", "fieldTwo"})
public class Foo {
String fieldOne;
String fieldTwo;
}
原文:
我不知道我真正得到你的意思,但看起來像你想的Class
類型一個Object
場的驗證。如果出現這種情況,您可以嘗試創建自定義註釋並執行ConstraintValidator
。下面的理念是:
1. 您的註釋創建界面:
public @interface Choice {
Class<?>[] types();
}
2。 創建的ConstraintValidator
一個實施檢查值進行驗證是types
裏面Choice
註釋:
public class ChoiceValidator implements ConstraintValidator<Choice, Object> {
private List<Class<?>> clazzes;
@Override
public void initialize(Choice choice) {
clazzes = Arrays.asList(choice.types());
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
for (Class<?> clazz : clazzes) {
if (value.getClass().equals(clazz)) {
return true;
}
}
return false;
}
}
之後,你可以用它像:
@Choice(types = {FieldOneType.class, FieldTwoType.class})
public class Foo {
Object someType;
}
希望這可以幫助。
你的意思是說你的班級有兩個字段('fieldOne'和'fieldTwo'),但只有其中一個允許有價值嗎? – Wilson
是的,這就是我想要的。 – colmulhall
我已經更新了答案。請看看它是否可以幫助 – Wilson