java - 如何排除对 Spring Java 中特定字段的验证
问题描述
如果未在特定字段上设置值,我必须忽略验证。例如,我有name
, productId
, productSerial
,productDesc
和productPrice
在此,name
是必填字段,因此始终会进行验证,其余字段是,optional
但如果在这些字段中设置了值,我必须进行验证。所以我为这些可选字段编写了自定义验证器,并且name
我正在javax.validation.constraints.NotNull
像这样使用@NotNull(message = "Name cannot be null")
Map
我从上游应用程序中获取所有这些值,并在我的应用程序中设置这些值Java bean
并执行validation
.
如果所有字段都可用Map
,则验证工作没有任何问题,但如果用户仅设置name
了必填字段并保留可选字段 - 我的自定义验证器尝试验证并抛出NullPointerException
我不想要的。
我希望我的自定义验证器验证是否在这些可选字段上设置了值,否则忽略验证-我不知道如何实现这一点:(如果有人可以帮助我并提供一些示例,将不胜感激。
工作场景:
Map<String,String> map = new HashMap();
map.put("name", "Apple"); // Always user will set this value - Mandatory
map.put("productId", "2342342"); // Optional but need to validate if this value is set
map.put("productSerial", "4334DDF43"); // Optional but need to validate if this value is set
map.put("productDesc", "iPhone"); // Optional but need to validate if this value is set
map.put("productPrice", "1303"); // Optional but need to validate if this value is set
// Once I get the map from upstream, I've to set the map value in my bean and validate
Product product = new Product();
product.setName(map.get("name"));
product.setProductId(map.get("productId"));
product.setProductSerial(map.get("productSerial"));
product.setProductDesc(map.get("productDesc"));
product.setProductPrice(map.get("productPrice"));
发生以下情况时获取 NullPointerException
Map<String,String> map = new HashMap();
map.put("name", "Apple");
Product product = new Product();
product.setName(map.get("name"));
product.setProductId(map.get("productId"));
product.setProductSerial(map.get("productSerial"));
product.setProductDesc(map.get("productDesc"));
product.setProductPrice(map.get("productPrice"));
请在下面找到我的代码:
产品.java
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotNull;
@Getter
@Setter
@ToString
@ValidParam
public class Product {
@NotNull(message = "Name cannot be null")
private String name;
private String productId;
private String productSerial;
private String productDesc;
private String productPrice;
}
有效参数.java
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Documented
@Constraint(validatedBy = ProductValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidParam {
String message() default "Invalid product data.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
ProductValidator.java
import org.springframework.beans.BeanWrapperImpl;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class ProductValidator implements ConstraintValidator<ValidParam, Object> {
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
String productId = (String) new BeanWrapperImpl(value).getPropertyValue("productId");
String productSerial = (String) new BeanWrapperImpl(value).getPropertyValue("productSerial");
String productDesc = (String) new BeanWrapperImpl(value).getPropertyValue("productDesc");
String productPrice = (String) new BeanWrapperImpl(value).getPropertyValue("productPrice");
if ((productId != null || productSerial != null) || (productDesc != null && productPrice != null)) {
System.out.println("validation success");
return true;
} else {
System.out.println("validation failed");
return false;
}
}
}
主.java
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class Main {
public static void main(String[] args) {
// I get this Map from the upstream app
Map<String,String> map = new HashMap();
map.put("name", "Apple"); // Always user will set this value - Mandatory
map.put("productId", "2342342"); // Optional but need to validate if this value is set
map.put("productSerial", "4334DDF43"); // Optional but need to validate if this value is set
map.put("productDesc", "iPhone"); // Optional but need to validate if this value is set
map.put("productPrice", "1303"); // Optional but need to validate if this value is set
// Once I get the map from upstream, I've to set the map value in my bean and validate
Product product = new Product();
product.setName(map.get("name"));
product.setProductId(map.get("productId"));
product.setProductSerial(map.get("productSerial"));
product.setProductDesc(map.get("productDesc"));
product.setProductPrice(map.get("productPrice"));
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<Product>> violations = validator.validate(product);
for (ConstraintViolation<Product> violation : violations) {
System.out.println(violation.getMessage());
throw new NullPointerException(violation.getMessage());
}
}
}
解决方案
推荐阅读
- html - 无法将无序列表与“flex-column”对齐
- ubuntu - 用尽了可用的身份验证方法 (PhpStorm 2019.3)
- git - .git/refs/heads/ 文件夹在 git fetch 后没有内容
- limit - 在 Google 表格查询中使用数字单元格引用限制
- javascript - Vue.js 中的二维数组
- oracle - Oracle APEX - 我需要帮助在 IG 报告上设置动态搜索过滤器
- performance - 性能差异押注 RAFT Orderer 和 Orderer with Kafka(延迟、吞吐量、TPS)
- graphics - OCaml 图形错误未绑定模块 mac OSX
- java - 在停车中的do while循环期间递增和递减值
- python - 您可以将自己的字体导入 PIL(Python 图像库)吗?