验证可选字段
Validating Optional Field
我有以下要求json
{
"ParameterA":"value",
"ParameterB":[
{
"key":"",
"value":""
},
{
"key":"",
"value":""
}
]
}
我正在尝试验证此 json ,我的要求是,如果存在 ParameterB,则肯定会在其中存在一个列表,否则 ParameterB 是 optional.Such,就好像只有 ParameterB 本身一样不存在应该不会有问题。
我正在寻找 java 验证注释。
我在键和值上使用了@NotNull,但无法决定在 ParameterB 上使用什么,因为它是存在列表的数组
因为它也有数据库连接,我正在使用 JPA 并进行此 REST 调用。
我在 ParameterB 上尝试了 @NotEmpty,但这没有帮助。我想要一个注释,这样如果 ParameterB 本身不存在,它就不会影响实际流程。以下案例
{
"ParameterA":"value"
}
如有任何建议或帮助,我们将不胜感激。
您正在寻找的验证不是标准验证。我不知道实现这种验证的现有注释。
幸运的是 javax.validation
可以使用自定义验证规则轻松扩展约束:
a) 创建约束注解
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = NullOrNotEmptyValidator.class)
@Documented
public @interface NullOrNotEmpty {
String message() default "{com.mycompany.constraints.nullornotempty}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
b) 实现验证器
import java.lang.reflect.Array;
import java.util.Map;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class NullOrNotEmptyValidator implements ConstraintValidator<NullOrNotEmpty, Object> {
@Override
public void initialize(NullOrNotEmpty constraintAnnotation) {
}
@Override
public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {
if (object == null) {
return true;
}
final Class<?> fieldClass = object.getClass();
if (fieldClass.isArray()) {
return Array.getLength(object) > 0;
}
if (Iterable.class.isAssignableFrom(fieldClass)) {
return ((Iterable) object).iterator().hasNext();
}
if (Map.class.isAssignableFrom(fieldClass)) {
return !((Map) object).isEmpty();
}
return false;
}
}
c) 定义默认错误信息
This step depends on validation engine you are using
包含 Hibernate Validator 示例的文章:Chapter 3. Creating custom constraints
尝试使用验证的第二个版本 API,它支持 java.util.Optional
在此处阅读更多内容https://beanvalidation.org/2.0
我有以下要求json
{
"ParameterA":"value",
"ParameterB":[
{
"key":"",
"value":""
},
{
"key":"",
"value":""
}
]
}
我正在尝试验证此 json ,我的要求是,如果存在 ParameterB,则肯定会在其中存在一个列表,否则 ParameterB 是 optional.Such,就好像只有 ParameterB 本身一样不存在应该不会有问题。
我正在寻找 java 验证注释。 我在键和值上使用了@NotNull,但无法决定在 ParameterB 上使用什么,因为它是存在列表的数组
因为它也有数据库连接,我正在使用 JPA 并进行此 REST 调用。
我在 ParameterB 上尝试了 @NotEmpty,但这没有帮助。我想要一个注释,这样如果 ParameterB 本身不存在,它就不会影响实际流程。以下案例
{
"ParameterA":"value"
}
如有任何建议或帮助,我们将不胜感激。
您正在寻找的验证不是标准验证。我不知道实现这种验证的现有注释。
幸运的是 javax.validation
可以使用自定义验证规则轻松扩展约束:
a) 创建约束注解
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = NullOrNotEmptyValidator.class)
@Documented
public @interface NullOrNotEmpty {
String message() default "{com.mycompany.constraints.nullornotempty}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
b) 实现验证器
import java.lang.reflect.Array;
import java.util.Map;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class NullOrNotEmptyValidator implements ConstraintValidator<NullOrNotEmpty, Object> {
@Override
public void initialize(NullOrNotEmpty constraintAnnotation) {
}
@Override
public boolean isValid(Object object, ConstraintValidatorContext constraintContext) {
if (object == null) {
return true;
}
final Class<?> fieldClass = object.getClass();
if (fieldClass.isArray()) {
return Array.getLength(object) > 0;
}
if (Iterable.class.isAssignableFrom(fieldClass)) {
return ((Iterable) object).iterator().hasNext();
}
if (Map.class.isAssignableFrom(fieldClass)) {
return !((Map) object).isEmpty();
}
return false;
}
}
c) 定义默认错误信息
This step depends on validation engine you are using
包含 Hibernate Validator 示例的文章:Chapter 3. Creating custom constraints
尝试使用验证的第二个版本 API,它支持 java.util.Optional
在此处阅读更多内容https://beanvalidation.org/2.0