标签: bean-validation

Bean验证@NotNull,@ NotBlank和@NotEmpty在JSF + Tomcat中不起作用

我在我的JSF托管bean中使用Hibernate Validation注释.当我使用时@NotNull,@NotBlank或者@NotEmpty它们似乎没有以任何方式触发.

@NotBlank(message = "{name.required}")
public String name;
Run Code Online (Sandbox Code Playgroud)

视图:

<h:outputLabel value="Name:" /> 
<h:inputText id="name" value="#{person.name}" size="20" />
<h:message for="name" style="color:red" />
Run Code Online (Sandbox Code Playgroud)

这是怎么造成的,我该如何解决?

jsf tomcat bean-validation jsf-2

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

Bean验证组 - 正确理解它

我试图了解Bean验证中的Groups.

所以,例如,如果我有一个bean,并且我只想要某些字段验证某些字段,我应该将它们分组?

 @NotNull (groups=MyClassX.class)
 @Min (groups=MyClassA.class)  // 1
 @Pattern(xxxxx, groups = MyClassA.class) // 2
 private String field1;

 @NotNull (groups=MyClassX.class)
 @Min (groups=MyClassX.class)
 @Pattern(xxxxx, groups=MyClassX.class))
 private String field2;

 @NotNull (groups=MyClassX.class)
 @Min (groups=MyClassX.class)
 @Pattern(xxxxx, groups=MyClassA.class) //3
 private String field3;
Run Code Online (Sandbox Code Playgroud)

我从上面的例子理解是,如果我通过MyClassA对验证,则仅@Min@PatternField1@Patternfield3只验证?(标有数字1,2和3)

我理解正确吗?没有Groups属性,我没有留下任何字段.所以没有默认组.

java javabeans bean-validation

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

我可以在ConstraintValidator中为Method参数更改属性路径吗?

如果您熟悉Bean验证框架,则您知道无法获取方法参数的名称.因此,如果对方法的第一个参数执行@NotNull约束并且验证失败,则getPropertyPath将类似于"arg1".

我想创建我自己的@NotNull版本,它可以取一个值,例如@NamedNotNull("emailAddress").但我无法弄清楚如何覆盖我的Validator中的#getPropertyPath?有没有办法做到这一点,或者我坚持使用"arg1"或"arg2"等.

编辑

根据我收到的答案,我能够提出以下实现,允许我从@QueryParam或@PathParam注释中获取值,并将其用作Bean验证注释(如@NotNull)的属性路径.

对于Jersey,您需要创建以下类.请注意DefaultParameterNameProvider的实现:

public class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> {
    @Override
    public ValidationConfig getContext( final Class<?> type ) {
        final ValidationConfig config = new ValidationConfig();
        config.parameterNameProvider( new RestAnnotationParameterNameProvider() );
        return config;
    }

    static class RestAnnotationParameterNameProvider extends DefaultParameterNameProvider {

        @Override
        public List<String> getParameterNames( Method method ) {
            Annotation[][] annotationsByParam = method.getParameterAnnotations();
            List<String> names = new ArrayList<>( annotationsByParam.length );
            for ( Annotation[] annotations : annotationsByParam ) {
                String name = getParamName( annotations );
                if ( name == null )
                    name = …
Run Code Online (Sandbox Code Playgroud)

java hibernate bean-validation jersey-2.0

23
推荐指数
2
解决办法
7568
查看次数

Java Bean Validation(JSR303)约束涉及几个bean属性之间的关系

假设我有以下简单的java bean:

class MyBean {
   private Date startDate;
   private Date endDate;
   //setter, getters etc...
}
Run Code Online (Sandbox Code Playgroud)

JSR 303中是否有一种机制来创建一个自定义验证器来验证startDate必须在endDate之前的约束?

在我看来,它是一个常见的用例,但我找不到这种多属性关系约束的任何例子.

java validation bean-validation

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

JPA - 找不到类型为enum的验证器

我有一个实体类,其中一个属性使用枚举类型,当我尝试持久化实体时,我得到以下异常:

javax.validation.UnexpectedTypeException: No validator could be found for type: model.schema.BaseYesNo
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?我的想法是,因为它是一个枚举,它应该已经由编译器验证,所以不需要某种验证器.(以下代码)

实体属性:

@Enumerated( EnumType.STRING )
@Column( name = "seeded_flag" )
private BaseYesNo seededFlag;

public BaseYesNo getSeededFlag() {
    return this.seededFlag;
}

public void setSeededFlag( BaseYesNo seededFlag ) {
    this.seededFlag = seededFlag;
}
Run Code Online (Sandbox Code Playgroud)

和枚举类型的定义:

public enum BaseYesNo {
    YES( "Y" ),
    NO( "N" );

    private String yesNoVal;

    private static Map< String, BaseYesNo > stringToEnum = new HashMap< String, BaseYesNo >();

    static {
            for ( BaseYesNo byn : BaseYesNo.values() ) {
            BaseYesNo.stringToEnum.put( byn.toString(), …
Run Code Online (Sandbox Code Playgroud)

java jpa bean-validation

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

为什么bean验证Min/Max约束不支持double类型?

有人可以向我解释为什么JPA支持double类型作为字段类型,但bean验证constaintsjavax.validation.constraints(即@Min/@Max)不支持它吗?我知道文档说这是由于舍入错误,但如果我选择字段类型,double我已经承认我并不关心显式精度.

遇到这种困境的场景如下:我有一个代表地球表面点的实体.如果精度在几厘米之内就可以了.它看起来像这样:

@Entity
public class Point {

    /**
     * The longitude in radians.
     */
    @Min(-Math.Pi)
    @Max(Math.Pi)
    double longitude;
    /**
     * The latitude in radians.
     */
    @Min(-Math.Pi / 2)
    @Max(Math.Pi / 2)
    double latitude;

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用,因为注释不支持double类型.但是使用BigDecimal它并不是一个真正的选择,因为我有一些广泛的计算,有多个点仍然需要相当快.我通过定义一个与doubles 一起使用的自定义约束检查来解决它,但不知怎的,我认为在整个故事中我都缺少一些东西.那么,我错过了什么?

java precision constraints bean-validation

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

如何在Spring MVC的@RequestBody参数中使用@Valid?

我在使用@Valid参数处理器上的处理程序方法时遇到问题@Controller.我的代码看起来像这样:

@RequestMapping(value=BIBBLE_BOBBLE_URI_PATTERN + "/widgets", method=RequestMethod.POST)
@ResponseBody
@ResponseStatus(HttpStatus.CREATED)
public Widget saveNewWidget(
        @PathVariable final String username,
        @PathVariable final String bibbleBobbleName,
        @Valid @RequestBody final Widget widget,
        final BindingResult results,
        final HttpServletRequest request,
        final HttpServletResponse response)
Run Code Online (Sandbox Code Playgroud)

其中Widget一个域对象的类在哪里.我正在使用@RequestBody注释来指示请求的有效负载映射到widget(在我的测试中,请求是JSON,尽管Jackson在我的类路径上,所以我也可以使用XML).

如您所见,该BindingResult参数紧跟在Widget参数之后,但是我收到以下错误:

java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!
Run Code Online (Sandbox Code Playgroud)

如何将@Valid注释应用于@RequestBody参数然后获得结果?

PS我正在annotation-driven用来处理控制器的连接,进行内容协商等.

data-binding validation spring spring-mvc bean-validation

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

如何在REST Web服务中处理资源验证?

我正在使用Spring,Jersey和Hibernate(JPA)在Java中构建REST Web服务.

现在我正在尝试在我的资源中添加对验证的支持.JSR-303(Bean验证)自然是一个合适的选择(我使用的是Hibernate Validator,它是JSR-303的参考实现).但是,我试图首先巩固一些概念.

在我看来,至少有两种可能的验证:

  • 对字段进行常规验证,例如检查属性是否为空,检查String属性是否是有效的电子邮件,检查Integer属性是否大于10等等.这是按预期工作的.我已经注册了一个JAX-RS ExceptionMapper,它可以映射javax.validation.ConstraintViolationException到正确的HTTP响应中.
  • 数据完整性验证

我将通过"数据完整性验证"的例子来解释我的意思.当两个或多个资源之间存在关系时会发生这种情况.想象一下两个资源:a Product和a Category.A Product 一个Category.当客户端向服务器发送要Product创建的表示(POST HTTP请求)时,它必须通知Category产品.当然,客户必须事先知道类别.用JSON想象一下:

{
   "quantity": "10",
   "state": "PRODUCED",
   "category": {
      "id": "123"
   }
}
Run Code Online (Sandbox Code Playgroud)

好吧,id的类别123可能不存在.如果我们尝试将其插入数据库,显然我们会得到一个与外键相关的异常.所以我假设我们必须验证这些问题并向客户端返回正确的消息,就像在常规属性验证中一样.


现在,我的主要问题是:

  1. 现在我正在通过JPA与Bean Validation的集成在数据访问级别执行验证.应在验证完成前/后的序列化过程,前/后数据库操作两者
  2. 如何处理数据完整性验证手动?(即明确地咨询数据库检查数据完整性)或者我们应该尝试插入它然后捕获数据库(或DAO)异常?Bean验证与此类验证无关,对吧?
  3. 如果您对JAX-RS/REST和Bean验证有任何经验,如果您让我知道,我将很高兴.使用群组?

这些问题与Java有些相关,但我也希望对这些问题有一些新的看法.一些技术独立的.:)如果您可以在REST Web服务上为这些问题提供自己的解决方案,那就太棒了.

java rest jpa jersey bean-validation

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

如何手动触发弹簧验证?

POJO字段上的带注释的弹簧验证在从json请求体创建时起作用.但是,当我手动创建相同的对象(使用setter)并想要触发验证时,我不知道该怎么做.

这是Registration类,它具有可以构建对象的Builder内部类.在构建方法中,我想触发弹簧验证.请滚动到底部并检查Builder.build()和Builder.valiate()方法以查看当前实现.我正在使用javax.validation.Validator来触发验证,但我更愿意在可能的情况下利用spring验证.

package com.projcore.dao;

import com.projcore.util.ToString;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import org.hibernate.validator.constraints.NotEmpty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.validation.ConstraintViolation;
import javax.validation.Valid;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.constraints.Size;
import java.util.List;
import java.util.Set;

/**
 * The data transfer object that contains the information of a Registration
 * and validation rules for attributes.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
public final class Registration {
    private static final Logger LOGGER = LoggerFactory.getLogger(Registration.class);

    private String id;

    @NotEmpty
    @Size(max = 255)
    private String messageId;

    @NotEmpty
    @Size(max = 255)
    private String version; …
Run Code Online (Sandbox Code Playgroud)

java spring bean-validation spring-boot

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

列表的Bean验证大小?

如何设置一个bean验证约束,它List应该至少包含1并且最多包含10个元素?

以下都不起作用:

@Min(1)
@Max(10)
@Size(min=1, max=10)
private List<String> list;
Run Code Online (Sandbox Code Playgroud)

java bean-validation

19
推荐指数
2
解决办法
2万
查看次数