我正在尝试通过Spring 3.0为Hibernate Validator 4.1设置自定义消息源.我已经设置了必要的配置:
<!-- JSR-303 -->
<bean id="validator"
class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="validationMessageSource" ref="messageSource"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
翻译是从我的消息源提供的,但似乎消息源中的替换令牌在消息源中被查找,即:
my.message=the property {prop} is invalid
Run Code Online (Sandbox Code Playgroud)
有人要求在messageSource中查找"prop".进入ResourceBundleMessageInterpolator.interpolateMessage我注意到javadoc说:
根据JSR 303中指定的算法运行消息插值.
注意:用户捆绑包中的查找是递归的,而默认捆绑包中的查找则不是!
在我看来,对于用户指定的bundle总是会发生递归,所以实际上我无法翻译像Size那样的标准消息.
如何插入我自己的消息源并能够在消息中替换参数?
我有一个名为User的实体,我想验证手机号码字段
手机号码字段不是强制性的,可以留空,但应该是10位数字.
如果用户输入的长度小于10位,则应抛出错误.
以下是我的用户类.
public class User {
@Size(min=0,max=10)
private String mobileNo;
}
Run Code Online (Sandbox Code Playgroud)
当我如上所述使用@Sized注释时,我可以验证大于10的值,但如果用户输入的数字少于10位,则不会引发错误.
我的要求是,如果用户将mobileNo字段留空,该字段有效,但如果输入了值,则验证应确保输入的数字仅为10位数和10位数.
我应该使用哪个注释来满足此要求?
这个例子有点人为; 我简化了它以删除无关的细节,并专注于我遇到的问题.我有一个看起来像这样的验证器:
@Component
public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {
@Autowired
UsernameService usernameService;
@Override
public void initialize(UniqueUsername uniqueUsername) {
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
return !usernameService.exists(s);
}
}
Run Code Online (Sandbox Code Playgroud)
我从我的控制器调用验证器,如下所示:
@RequestMapping
public void checkUsername(Model model, User user) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<User>> constraintViolations = validator.validateProperty(user, "username");
model.addAttribute("error", constraintViolations.size() > 0);
}
Run Code Online (Sandbox Code Playgroud)
但是,我一直有NullPointerException例外.我在验证器添加一个断点,并看到usernameService了null.为什么不进行自动装配?最初我认为这是因为我没有注释验证器@Component,但即使在注释它之后我仍然有同样的问题.该UsernameService班已经标注了@Service,我可以验证它的构造函数获取调用.
我是Spring的新手,所以我甚至不确定将服务连接到验证器是否可以.我究竟做错了什么?
我在自定义约束验证器中有bean自动装配的问题.使用Spring的LocalValidatorFactoryBean不会给出约束验证器实例.JSR-303提供程序是hibernate-validator 4.2.0.Final.
Spring配置摘录:
<!-- JSR 303 validation -->
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/>
Run Code Online (Sandbox Code Playgroud)
自定义约束验证器:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Autowired;
import com.model.Subject;
import com.services.SomeTypeService;
public class ReadOnlyValidator implements ConstraintValidator<ReadOnly, String> {
@Autowired
private SomeTypeService someTypeService;
@Override
public void initialize(ReadOnly constraintAnnotation) { }
@Override
public boolean isValid(String type, ConstraintValidatorContext context) {
try {
if (null != type) {
return !someTypeService.isReadonly(type);
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
注解:
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
import …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来验证java.lang.DoubleSpring命令bean中的字段的最大值和最小值(值必须介于给定的值范围之间),例如,
public final class WeightBean
{
@Max(groups={ValidationGroup.class}, value=Double.MAX_VALUE, message="some key or default message")
@Min(groups={ValidationGroup.class}, value=1D, message="some key or default message")
private Double txtWeight; //Getter and setter.
public interface ValidationGroup{}
}
Run Code Online (Sandbox Code Playgroud)
但两者@Max并@Min不能取java.lang.Double值.
请注意,由于舍入错误,不支持double和float(某些提供程序可能提供一些近似支持)
那么验证这些领域的方法是什么?
我正在使用Spring 3.2.0和Hibernate Validator 4.3.1 CR1.
validation spring spring-mvc hibernate-validator bean-validation
我正在开发一个使用bean验证的项目(Hibernate Validator 5.1.3.Final).我的bean有一个带@Past注释的属性.
@Past(message = "A data deve estar no passado.")
private LocalDate dataAbertura;
Run Code Online (Sandbox Code Playgroud)
但是,当验证发生时,我得到以下异常:
21:46:12,424 ERROR [io.undertow.request] (default task-35) UT005023: Exception handling request to /financeiro/clientes/pessoafisica: javax.servlet.ServletException: javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.time.LocalDate.
at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:127) [vraptor-4.1.4.jar:]
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63) [undertow-servlet-1.1.0.Final.jar:1.1.0.Final]
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.0.Final.jar:1.1.0.Final] …Run Code Online (Sandbox Code Playgroud) 我有以下会话工厂配置:
<session-factory>
<property name="javax.persistence.validation.group.pre-persist">javax.validation.groups.Default</property>
<property name="javax.persistence.validation.group.pre-update">javax.validation.groups.Default</property>
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
<property name="hibernate.showSql">true</property>
<property name="hbm2ddl.auto">validate</property>
<mapping class="com.terminal.domain.Terminal"/>
...
</session-factory>
Run Code Online (Sandbox Code Playgroud)
终端类:
@Entity
@Table(name = "terminal")
public class Terminal {
@Column(name = "cost")
@Min(100)
private Long cost;
// get and set
}
Run Code Online (Sandbox Code Playgroud)
我的服务方法中有以下代码:
Terminal terminal = new Terminal();
terminal.setCost(98L);
session.save(terminal);
Run Code Online (Sandbox Code Playgroud)
当我调用它时,新行添加在terminal表中.
预期结果:验证异常和新行不会添加到terminal表中.
为什么实际结果与预期不同?
PS
PPS
hibernate的东西依赖:
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.3.2.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.3.1.GA</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.3.0.ga</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId> …Run Code Online (Sandbox Code Playgroud) 我对Spring来说是全新的,我已经在SO上找到了一些问题的答案.以下是链接:
Autowired Repository在自定义约束验证器中为空
我有一个Spring项目,我想在其中使用Hibernate Validator进行对象验证.基于我在网上阅读的内容和一些论坛,我试图注入验证器如下:
@Bean
public Validator validator() {
return new LocalValidatorFactoryBean().getValidator();
}
Run Code Online (Sandbox Code Playgroud)
但无论我在哪里使用
@Autowired
Validator validator;
Run Code Online (Sandbox Code Playgroud)
它采用了Spring的验证器实现而不是Hibernate的验证器.我无法弄清楚如何准确地注入Hibernate验证器并简单地将其自动装配到其他类中,所以我使用了一个便宜的技巧,现在我的Java Config看起来像这样
@Bean
public Validator validator() {
// ValidatorImpl is Hibernate's implementation of the Validator
return new ValidatorImpl();
}
Run Code Online (Sandbox Code Playgroud)
(我真的很感激,如果有人能指出我如何避免以这种Hacky方式获得Hibernate Validator的正确方向)
但是让我们来看看主要问题:
这是自定义验证定义
@Target( { METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER } )
@Retention(RUNTIME)
@Constraint(validatedBy = EmployeeValidator.class)
@Documented
public @interface EmployeeValidation {
String message() default "{constraints.employeeConstraints}";
public abstract Class<?>[] groups() default {};
public abstract Class<? extends Payload>[] payload() …Run Code Online (Sandbox Code Playgroud) 根据当前的doc(5.0.0.RELEASE),Spring Webflux在使用带注释的控制器时支持验证:
默认情况下,如果类路径上存在Bean Validation - 例如Hibernate Validator,则LocalValidatorFactoryBean将注册为全局Validator,以便与@Valid和@Controller方法参数上的Validated一起使用.
但是没有说明如何使用功能端点自动化它.实际上,文档中唯一的输入处理示例并不验证任何内容:
public Mono<ServerResponse> createPerson(ServerRequest request) {
Mono<Person> person = request.bodyToMono(Person.class);
return ServerResponse.ok().build(repository.savePerson(person));
}
Run Code Online (Sandbox Code Playgroud)
我们应该手动执行此操作还是有一些自动方法可以执行此操作?
JDK:1.8.0_131
Tomcat:8.0.27.0
Hibernate Validator:6.0.7.Final +从下载的所有依赖项:Hibernate Validator 6
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public AccountSyncResponse excute(AccountSyncRequest account_sync_request_)
{
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set<ConstraintViolation<AccountSyncRequest>> violations = validator.validate(account_sync_request_);
.
.
.
.
AccountSyncResponse _AccountSyncResponse = new AccountSyncResponse();
return _AccountSyncResponse;
}
Run Code Online (Sandbox Code Playgroud)
代码失败,Validation.buildDefaultValidatorFactory()异常:
java.lang.NoSuchMethodError: javax.validation.BootstrapConfiguration.getClockProviderClassName()Ljava/lang/String;
at org.hibernate.validator.internal.xml.ValidationBootstrapParameters.<init>(ValidationBootstrapParameters.java:63)
at org.hibernate.validator.internal.engine.ConfigurationImpl.parseValidationXml(ConfigurationImpl.java:527)
at org.hibernate.validator.internal.engine.ConfigurationImpl.buildValidatorFactory(ConfigurationImpl.java:328)
at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:110)
Run Code Online (Sandbox Code Playgroud)
看起来好像正在使用错误的jar文件,但我无法弄清楚哪一个.
java validation hibernate hibernate-validator bean-validation
spring ×7
java ×5
validation ×5
spring-mvc ×3
hibernate ×2
autowired ×1
java-ee ×1
java-ee-7 ×1
persistence ×1
phone-number ×1
spring-3 ×1