首页 > 解决方案 > 如何排除对 Spring Java 中特定字段的验证

问题描述

如果未在特定字段上设置值,我必须忽略验证。例如,我有name, productId, productSerial,productDescproductPrice

在此,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());
            }
        }
    }

标签: javaspringvalidationspring-validator

解决方案


推荐阅读