标签: hibernate-validator

使用带有Hibernate Validator的自定义ResourceBundle

我正在尝试通过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那样的标准消息.

如何插入我自己的消息源并能够在消息中替换参数?

spring hibernate-validator bean-validation

12
推荐指数
1
解决办法
1万
查看次数

使用Hibernate注释验证移动号码

我有一个名为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位数.

我应该使用哪个注释来满足此要求?

java phone-number hibernate-validator bean-validation

12
推荐指数
3
解决办法
3万
查看次数

将服务自动装配到验证器中

这个例子有点人为; 我简化了它以删除无关的细节,并专注于我遇到的问题.我有一个看起来像这样的验证器:

@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例外.我在验证器添加一个断点,并看到usernameServicenull.为什么不进行自动装配?最初我认为这是因为我没有注释验证器@Component,但即使在注释它之后我仍然有同样的问题.该UsernameService班已经标注了@Service,我可以验证它的构造函数获取调用.

我是Spring的新手,所以我甚至不确定将服务连接到验证器是否可以.我究竟做错了什么?

validation spring autowired hibernate-validator spring-3

11
推荐指数
1
解决办法
1万
查看次数

Spring 3.1自动装配在自定义约束验证器中不起作用

我在自定义约束验证器中有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)

validation spring customvalidator hibernate-validator

11
推荐指数
1
解决办法
8145
查看次数

使用Hibernate Validator验证double和float值 - bean验证

我正在寻找一种方法来验证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

11
推荐指数
3
解决办法
3万
查看次数

错误:找不到类型的验证程序:java.time.LocalDate

我正在开发一个使用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)

java java-ee hibernate-validator bean-validation java-ee-7

11
推荐指数
1
解决办法
1万
查看次数

在数据库中持久化不会发生hibernate验证

我有以下会话工厂配置:

     <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

据我所知,它应该开箱即用 http://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-checkconstraints.html#validator-checkconstraints-orm-hibernateevent

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)

java spring persistence hibernate hibernate-validator

11
推荐指数
1
解决办法
1662
查看次数

Autowired在Custom Constraint验证器中提供Null值

我对Spring来说是全新的,我已经在SO上找到了一些问题的答案.以下是链接:

Spring 3.1自动装配在自定义约束验证器中不起作用

将服务自动装配到验证器中

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)

java validation spring spring-mvc hibernate-validator

11
推荐指数
1
解决办法
8464
查看次数

Spring 5 Webflux功能端点 - 如何执行输入验证?

根据当前的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)

我们应该手动执行此操作还是有一些自动方法可以执行此操作?

spring spring-mvc hibernate-validator spring-webflux

10
推荐指数
2
解决办法
1761
查看次数

java.lang.NoSuchMethodError:javax.validation.BootstrapConfiguration.getClockProviderClassName

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

10
推荐指数
3
解决办法
7536
查看次数