springboot validator 验证器
springboot validator 验证器
**********************
相关类与接口
Validator:spring 提供接口,可对类进行验证
public interface Validator {
boolean supports(Class<?> clazz); //验证的类
void validate(Object target, Errors errors); //自定义验证规则
}
DataBinder
public class DataBinder implements PropertyEditorRegistry, TypeConverter {
public static final String DEFAULT_OBJECT_NAME = "target";
public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;
protected static final Log logger = LogFactory.getLog(DataBinder.class);
private final Object target;
private final String objectName;
private AbstractPropertyBindingResult bindingResult;
private SimpleTypeConverter typeConverter;
private boolean ignoreUnknownFields = true;
private boolean ignoreInvalidFields = false;
private boolean autoGrowNestedPaths = true;
private String[] allowedFields;
private String[] disallowedFields;
private String[] requiredFields;
private ConversionService conversionService;
private MessageCodesResolver messageCodesResolver;
private BindingErrorProcessor bindingErrorProcessor = new DefaultBindingErrorProcessor();
private int autoGrowCollectionLimit = DEFAULT_AUTO_GROW_COLLECTION_LIMIT;
private final List<Validator> validators = new ArrayList<>();
**************
构造函数
public DataBinder(@Nullable Object target) {
public DataBinder(@Nullable Object target, String objectName) {
**************
普通方法
public boolean isAutoGrowNestedPaths() {
public Object getTarget() {
public String getObjectName() {
public int getAutoGrowCollectionLimit() {
public void setAutoGrowNestedPaths(boolean autoGrowNestedPaths) {
public void setAutoGrowCollectionLimit(int autoGrowCollectionLimit) {
public void initBeanPropertyAccess() {
public void initDirectFieldAccess() {
***********
验证器
public void setValidator(@Nullable Validator validator) {
public void addValidators(Validator... validators) {
public void replaceValidators(Validator... validators) {
public Validator getValidator() {
public List<Validator> getValidators() {
private void assertValidators(Validator... validators) {
***********
格式化器
public void addCustomFormatter(Formatter<?> formatter) {
public void addCustomFormatter(Formatter<?> formatter, String... fields) {
public void addCustomFormatter(Formatter<?> formatter, Class<?>... fieldTypes) {
***********
自定义编辑器
public void registerCustomEditor(Class<?> requiredType, PropertyEditor propertyEditor) {
public void registerCustomEditor(@Nullable Class<?> requiredType, @Nullable String field, PropertyEditor propertyEditor) {
public PropertyEditor findCustomEditor(@Nullable Class<?> requiredType, @Nullable String propertyPath) {
***********
convertIfNecessary操作
public <T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType) throws TypeMismatchException {
public <T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType,
@Nullable MethodParameter methodParam) throws TypeMismatchException {
public <T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType, @Nullable Field field)
throws TypeMismatchException {
public <T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType,
@Nullable TypeDescriptor typeDescriptor) throws TypeMismatchException {
public BindingResult getBindingResult() {
public void bind(PropertyValues pvs) {
protected void doBind(MutablePropertyValues mpvs) {
public boolean isIgnoreInvalidFields() {
public boolean isIgnoreUnknownFields() {
public void setIgnoreUnknownFields(boolean ignoreUnknownFields) {
public void setIgnoreInvalidFields(boolean ignoreInvalidFields) {
public void setAllowedFields(@Nullable String... allowedFields) {
public void setDisallowedFields(@Nullable String... disallowedFields) {
public void setRequiredFields(@Nullable String... requiredFields) {
public String[] getAllowedFields() {
public String[] getDisallowedFields() {
public String[] getRequiredFields() {
public void setMessageCodesResolver(@Nullable MessageCodesResolver messageCodesResolver) {
public void setBindingErrorProcessor(BindingErrorProcessor bindingErrorProcessor) {
public void setConversionService(@Nullable ConversionService conversionService) {
public BindingErrorProcessor getBindingErrorProcessor() {
public ConversionService getConversionService() {
public void validate() {
public void validate(Object... validationHints) {
public Map<?, ?> close() throws BindException {
protected void checkAllowedFields(MutablePropertyValues mpvs) {
protected boolean isAllowed(String field) {
protected void checkRequiredFields(MutablePropertyValues mpvs) {
protected void applyPropertyValues(MutablePropertyValues mpvs) {
protected AbstractPropertyBindingResult createBeanPropertyBindingResult() {
protected AbstractPropertyBindingResult createDirectFieldBindingResult() {
protected AbstractPropertyBindingResult getInternalBindingResult() {
protected ConfigurablePropertyAccessor getPropertyAccessor() {
protected SimpleTypeConverter getSimpleTypeConverter() {
protected PropertyEditorRegistry getPropertyEditorRegistry() {
protected TypeConverter getTypeConverter() {
**********************
示例
*****************
pojo 层
Order
@Data
public class Order {
private String orderId;
private Double price;
private Integer amount;
private Double totalFee;
}
*****************
config 层
CustomValidatior
public class CustomValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Order.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Order order=(Order)target;
if (Math.abs(order.getTotalFee()-order.getPrice()*order.getAmount())>0.01){
errors.rejectValue("totalFee","totalFeeError","totalFee 与 price*amount 相差超过 0.01");
}
}
}
*****************
controller 层
HelloController
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(@Validated Order order, BindingResult result){
System.out.println(order);
if (result.hasErrors()){
result.getAllErrors().forEach(error -> {
System.out.print("field:"+error.getObjectName()+" "+error.getCode());
System.out.println(" ==> message:"+error.getDefaultMessage());
});
}
return "success";
}
@InitBinder
private void bind(DataBinder binder){
binder.setValidator(new CustomValidator());
}
}
**********************
示例
localhost:8080/hello?orderId=1&price=2&amount=8&totalFee=8
2020-07-15 21:19:00.890 INFO 14568 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2020-07-15 21:19:00.898 INFO 14568 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 8 ms
Order(orderId=1, price=2.0, amount=8, totalFee=8.0)
field:order totalFeeError ==> message:totalFee 与 price*amount 相差超过 0.01
自定义验证规则设置成功
还没有评论,来说两句吧...