validator icon indicating copy to clipboard operation
validator copied to clipboard

有没有考虑过这玩 类似json schema不过是用注解的表述方式

Open hzdjulytech opened this issue 1 year ago • 0 comments

`import java.lang.annotation.Annotation; import java.util.HashMap; import java.util.List; import java.util.Map;

import jakarta.validation.constraints.Max; import jakarta.validation.constraints.Min;

public class ValidX {

public interface IValidator {
	/**
	 * 
	 * @param root
	 * @param ruleIdent 通过外部规则文件处理
	 * @param groups
	 */
	void valid(Object root, String ruleIdent, Class<?> ... groups);
	/**
	 * 
	 * @param root
	 * @param equityClass  对等规则类型  如果第三方类不方便修改 可以自己定义一个对等的
	 * @param class2
	 */
	void valid(Object root, Class<A> equityClass,  Class<?> ... groups);
}

public interface IValidMetaDataProvider {

	 List<ValidMetaData> getTopValidMetaData(String rootRuleIdent, Class<?> ... groups)  ;
	 
	 List<ValidMetaData> getAttrValidMetaData(String rootRuleIdent,String attrPath, Class<?> ... groups)  ;
	 //通过指定注释名称 和属性值 构建一个注解对象实例 
	 //让通过配置配置的规则和直接写在类上的注解一致
	 <A extends Annotation > A  pretendAnnotation(Class<A> annotationType,Map<String,Object> annotationValues);
}

public interface ValidMetaData {

	Annotation getRuleAnnotation();

}
public interface ValidGroupA {
	
}
public interface ValidGroupB {
	
}
class Cxt{
	
}

 
class IValidatorImpl implements IValidator{
	IValidMetaDataProvider validMetaDataProvider;
	
	@Override
	public void valid(Object root, String ruleIdent, Class<?>... groups) {
		 //定级规则  对应 class 上的验证规则
		 Cxt  cxt = new Cxt();
		 List<ValidMetaData>  topRules = validMetaDataProvider.getTopValidMetaData(ruleIdent, groups);
		 for (ValidMetaData validMetaData : topRules) {
			  exec(root,validMetaData,cxt);
		 }
		 //对应属性上的规则
		 List<String > attrs = getAttrs(root);
		 for (String attrPath : attrs) {
			 Object value = getAttrValue(root,attrPath);
			 List<ValidMetaData>  lis= validMetaDataProvider.getAttrValidMetaData(  ruleIdent,  attrPath,   groups)  ;
			 for (ValidMetaData validMetaData : lis) {
				  exec(root,attrPath,value,validMetaData,cxt);
			 }
		}
	}
	private void exec(Object root, String attrPath, Object value, ValidMetaData validMetaData, Cxt cxt) {
		 
		
	}
	private Object getAttrValue(Object object, String attrPath) {
		 
		return null;
	}
	private void exec(Object object, ValidMetaData validMetaData, Cxt cxt) {
		java.lang.annotation.Annotation annotation = validMetaData.getRuleAnnotation();
		 
		
	}
	@Override
	public void valid(Object root, Class<A> equityClass, Class<?>... groups) {
		// TODO Auto-generated method stub
		
	}
	
}

 
   
  
   class A{
		  @Min(value = 1L)
		  @Max(value = 100L)
		  Integer intVal;
	  }
   
void valid() {
	 IValidator validator  =newValidator();
	 IValidMetaDataProvider validMetaDataProvider = null ;
     Map<String,Object> obj  = new HashMap<String, Object>();
     obj.put("intVal", 1);
     /*
      * 验证规则标识 :{
	        intVal:[
	        { 
	            ann:"jakarta.validation.constraints.Min",
	             attrs:{value:1L}
	        },{
	          ann:"jakarta.validation.constraints.Max",
	           attrs:{value:100L}
	         }
	         ]
         }
      * 
      */
     validator.valid(obj,"验证规则标识",ValidGroupA.class);
    
     validator.valid(obj,A.class,ValidGroupA.class);
     
}
public List<String> getAttrs(Object object) {
	 
	return null;
}
private IValidator newValidator() {
	 
	return null;
}

} `

hzdjulytech avatar Feb 20 '24 06:02 hzdjulytech