Java Spring Validator接口的supports()方法到底是如何工作的?

Java Spring Validator接口的supports()方法到底是如何工作的?,java,spring,validation,spring-mvc,spring-validator,Java,Spring,Validation,Spring Mvc,Spring Validator,我是Spring MVC的新手,我对这个验证器示例的工作原理有以下疑问: 因此,我有一个search.jsp页面,在该页面中,用户可以通过两个字段标准(产品名称和产品所属的类别)搜索产品: 搜寻 搜索产品 姓名: 类别: 搜索结果: 因此,在本教程中,我们对前一个视图的两个字段的输入引入了一些限制,这两个字段实现了一个自定义验证器。在特定情况下,用户必须: 1) 用户必须插入产品名称或类别 2) 名称长度必须至少由3个字符组成 3) 用户只能按名称或类别进行选择,但不能在产品的其他字段上进

我是Spring MVC的新手,我对这个验证器示例的工作原理有以下疑问:

因此,我有一个search.jsp页面,在该页面中,用户可以通过两个字段标准(产品名称和产品所属的类别)搜索产品:


搜寻
搜索产品
姓名:
类别:
搜索结果:

因此,在本教程中,我们对前一个视图的两个字段的输入引入了一些限制,这两个字段实现了一个自定义验证器。在特定情况下,用户必须:

1) 用户必须插入产品名称或类别

2) 名称长度必须至少由3个字符组成

3) 用户只能按名称或类别进行选择,但不能在产品的其他字段上进行选择

要实现此自定义验证器,需要创建此ProductSearchValidator类,以实现Spring验证器接口:

package com.packtpub.springmvc.chocolatestore;

import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import com.packtpub.springmvc.chocolatestore.model.Product;

@Component
public class ProductSearchValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return Product.class.isAssignableFrom(clazz);  
    }

    @Override
    public void validate(Object target, Errors errors) {
        Product product = (Product) target;
        String name = product.getName();
        if (!StringUtils.hasLength(name) && (product.getCategory() == null || product.getCategory().getId() == 0)) {
            errors.rejectValue("name", "required", "Either name or category is required");
        } else if ((product.getCategory() == null || product.getCategory().getId() == 0) && name.trim().length() < 3) {
            errors.rejectValue("name", "tooShort", "Please enter at least 3 letters");
        }

    }

}
package com.packtpub.springmvc.chocolatestore;
导入org.springframework.stereotype.Component;
导入org.springframework.util.StringUtils;
导入org.springframework.validation.Errors;
导入org.springframework.validation.Validator;
导入com.packtpub.springmvc.chocolatestore.model.Product;
@组成部分
公共类ProductSearchValidator实现验证器{
@凌驾
公共布尔支持(类clazz){
返回产品.class.isAssignableFrom(clazz);
}
@凌驾
公共无效验证(对象目标、错误){
产品=(产品)目标;
字符串名称=product.getName();
如果(!StringUtils.hasLength(name)&&(product.getCategory()=null | | product.getCategory().getId()=0)){
错误。拒绝值(“名称”、“必需”、“需要名称或类别”);
}else if((product.getCategory()==null | | product.getCategory().getId()==0)和&name.trim().length()<3){
错误。拒绝值(“名称”、“tooShort”、“请输入至少3个字母”);
}
}
}
据我所知,supports()方法表示是否可以从此验证器验证类的特定实例,validate()方法实现特定的验证逻辑

好的,validate()方法对我来说非常清楚(它实现了前面3个指定的限制)

我不明白的是到底是如何支持()方法的

@Override
public boolean supports(Class<?> clazz) {
    return Product.class.isAssignableFrom(clazz);  
}
@覆盖
公共布尔支持(类clazz){
返回产品.class.isAssignableFrom(clazz);
}
具体是如何工作的?什么表示其输入参数(类clazz)?什么表示返回的布尔值?(Product.class.isAssignableFrom(clazz)
评估的含义是什么?)

Tnx

supports()方法说明是否可以从此验证器验证类的特定实例

否。它表示验证器是否支持特定类。验证对象时,对象本身不会传递给
supports()
。传递给
supports()
的是对象的类

因此,在验证
Product
的实例之前,Spring调用
supports()
,并将
Product.class
作为参数

在验证
subassofproduct
的实例之前,Spring调用
supports()
,并将
subassofproduct.class
作为参数

在这两种情况下,由于Product.class可从Product.class/subassofproduct.class赋值,因此该方法返回true。如果您尝试使用该验证器验证用户,它将返回false。事实上,你可以做到

Product p = someProductInstance;
你也可以

Product p = someSubClassOfProductInstance;
但你做不到

Product p = someUserInstance;
这就是
Product.class.isAssignableFrom(clazz)
的意思

请参阅相关的javadocs,它基本上解释了我刚才解释的内容:


像往常一样,您的解释非常完美,tnx:-)
Product p = someUserInstance;