Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建名为的bean时出错。结合bean验证和基于Spring的验证_Java_Spring_Validation_Spring Mvc - Fatal编程技术网

Java 创建名为的bean时出错。结合bean验证和基于Spring的验证

Java 创建名为的bean时出错。结合bean验证和基于Spring的验证,java,spring,validation,spring-mvc,Java,Spring,Validation,Spring Mvc,我希望结合bean验证和Spring验证(基于《springmvc初学者指南》一书),但存在以下错误: 我的日志: 我的控制器: @Controller() @RequestMapping("/products") public class ProductController { @Autowired private ProductService productService; @Autowired private ProductValidator produ

我希望结合bean验证和Spring验证(基于《springmvc初学者指南》一书),但存在以下错误: 我的日志:

我的控制器:

@Controller()
@RequestMapping("/products")
public class ProductController {

    @Autowired
    private ProductService productService;

    @Autowired
    private ProductValidator productValidator;
[...]
    @RequestMapping(value = "/add", method = RequestMethod.POST)
    public String processAddNewProductForm(@Valid @ModelAttribute("newProduct") Product productToBeAdded, BindingResult result,
                                           HttpServletRequest httpServletRequest){
        if(result.hasErrors())
            return "addProduct";

        String[] suppressedFields = result.getSuppressedFields();
        if(suppressedFields.length > 0){
            throw new RuntimeException("abc" + StringUtils.arrayToCommaDelimitedString(suppressedFields));
        }

        MultipartFile productImage = productToBeAdded.getProductImage();

        String rootDirectory = httpServletRequest.getSession().getServletContext().getRealPath("/");
        if(productImage != null && !productImage.isEmpty()){
            try {
                productImage.transferTo(new File(rootDirectory + "resources\\images\\" +
                                                    productToBeAdded.getProductId() + ".png"));
            } catch (IOException e) {
                throw new RuntimeException("abcd", e);
            }
        }

        productService.addProduct(productToBeAdded);
        return "redirect:/products";
    }

    @InitBinder
    public void initialiseBinder(WebDataBinder binder){
        binder.setValidator(productValidator);
    }
[...]
}
我的类验证

@Component
public class ProductValidator implements Validator {
    @Autowired
    private javax.validation.Validator beanValidator;

    private Set<Validator> springValidators;

    public ProductValidator() {
        this.springValidators = new HashSet<>();
    }

    public void setSpringValidators(Set<Validator> springValidators) {
        this.springValidators = springValidators;
    }

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

    @Override
    public void validate(Object target, Errors errors) {
        Set<ConstraintViolation<Object>> constraintViolations = beanValidator.validate(target);
        for(ConstraintViolation<Object> constraintViolation: constraintViolations){
            String propertyPath = constraintViolation.getPropertyPath().toString();
            String message = constraintViolation.getMessage();
            errors.rejectValue(propertyPath, "", message);
        }
        for(Validator validator: springValidators){
            validator.validate(target, errors);
        }
    }
}
@组件
公共类ProductValidator实现验证器{
@自动连线
私有javax.validation.Validator beanValidator;
私有集验证程序;
公共产品验证程序(){
this.springValidators=newhashset();
}
public void setSpringValidators(Set springValidators){
this.springValidators=springValidators;
}
@凌驾
公共布尔支持(类aClass){
返回Product.class.isAssignableFrom(aClass);
}
@凌驾
公共无效验证(对象目标、错误){
设置constraintViolations=beanValidator.validate(目标);
for(ConstraintViolation ConstraintViolation:constraintViolations){
String propertyPath=constraintViolation.getPropertyPath().toString();
String message=constraintViolation.getMessage();
错误。拒绝值(propertyPath,“,消息);
}
for(验证器验证器:springValidators){
验证(目标,错误);
}
}
}
我的DispatcherServlet上下文

<?xml version="1.0" encoding="UTF-8"?>
[...]

    <mvc:annotation-driven enable-matrix-variables="true"/>
    <mvc:resources mapping="/resource/**" location="/resources/" />
    <mvc:annotation-driven enable-matrix-variables="true" validator="validator"/>

    <context:component-scan base-package="com.packt.webstore" />

[...]

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
        <property name="defaultLocale" value="pl" />
    </bean>

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>

    <bean id="productValidator" class="com.packt.webstore.validator.ProductValidator">
        <property name = "springValidators">
            <set>
                <ref bean = "unitsInStockValidator"/>
            </set>
        </property>
    </bean>

    <bean id="unitsInStockValidator" class="com.packt.webstore.validator.UnitsInStockValidator"/>
</beans>

[...]
[...]

最初,没有注解@Component,我添加了它,但没有任何改变,您得到的错误是b/c spring无法确定要注入ProductValidator的验证器bean,只需在bean配置文件中将其标记为主,以便spring知道要使用哪一个

 <bean id="validator" primary="true" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
 </bean>


我印象深刻,你是怎么知道的…:)现在可以了,谢谢!没关系,我一直都是你。阅读您的异常。Spring说它在应用程序上下文中有2个验证程序bean。Spring并不决定使用哪一个,这就是它抛出异常的原因。很高兴为您修复了它:)
 <bean id="validator" primary="true" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
 </bean>