【发布时间】:2017-07-28 06:06:12
【问题描述】:
我一直在我的 Spring 项目中使用 Hibernate Validator。我即将自动验证我的JUser 对象。即,我希望 Spring 验证对象并在 BindigResult 中设置错误。但它不起作用。
pom.xml
<properties>
<spring.version>4.3.5.RELEASE</spring.version>
<spring.security.version>4.0.2.RELEASE</spring.security.version>
<hibernate.version>4.3.11.Final</hibernate.version>
<validation-api.version>1.1.0.Final</validation-api.version>
<hibernate-validator.version>5.4.0.Final</hibernate-validator.version>
</properties>
....
applicationContext.xml
...
<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
<context:annotation-config />
<context:component-scan base-package="my.project.controller" />
<mvc:annotation-driven validator="validator">
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages"/>
</bean>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
</bean>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
<property name="validator" ref="validator"/>
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="defaultLocale" value="en" />
</bean>
JUser.java
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
public class JUser implements Officeable {
@Id
private Long id;
@Column(unique = true, nullable = false)
private String username;
private String password;
@NotEmpty
private String firstName;
@NotEmpty
private String lastName;
private String tel;
}
UserController.java
import javax.validation.ConstraintViolationException;
....
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String update2(HttpServletRequest request, Model model, @ModelAttribute("user") @Valid JUser user, BindingResult result) {
if (!result.hasErrors()) {
System.out.println("binding result has no errors for user ");
try {
JUser updated = userService.update(user);
model.addAttribute("user", updated);
} catch (MessageException | DataIntegrityViolationException ex) {
result.reject("user", ex.getMessage());
} catch (ConstraintViolationException cvex) {
for (ConstraintViolation cv : cvex.getConstraintViolations()) {
result.rejectValue(cv.getPropertyPath().toString(),cv.getMessageTemplate() , cv.getMessage());
}
}
}
return "user/manage";
}
正如您在上面的控制器方法中看到的,我希望 Spring 验证 user 对象并在 BindigResult 中设置错误。但它不起作用。
例如当user 有空firstName 我面对输出:
output:
binding result has no errors for user
我必须手动捕获休眠引发的异常:
ConstraintViolationException: may not be empty ...
更多描述。我使用了 String @Validated 注释,但效果不佳。我已经阅读了十多个相关的 stackoverflow 问题,但它们并没有解决我的问题。
【问题讨论】:
-
不确定您要进行什么样的验证,您还可以添加 JUser 对象的内容吗?
-
通过验证 API 注释进行简单验证。问题已编辑。
标签: spring validation spring-mvc hibernate-validator spring-validator