Java 创建名为的bean时出错。结合bean验证和基于Spring的验证
我希望结合bean验证和Spring验证(基于《springmvc初学者指南》一书),但存在以下错误: 我的日志: 我的控制器: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
@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>