我在我的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)
这是怎么造成的,我该如何解决?
我试图了解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及@Pattern于Field1和@Pattern为field3只验证?(标有数字1,2和3)
我理解正确吗?没有Groups属性,我没有留下任何字段.所以没有默认组.
如果您熟悉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 bean:
class MyBean {
private Date startDate;
private Date endDate;
//setter, getters etc...
}
Run Code Online (Sandbox Code Playgroud)
JSR 303中是否有一种机制来创建一个自定义验证器来验证startDate必须在endDate之前的约束?
在我看来,它是一个常见的用例,但我找不到这种多属性关系约束的任何例子.
我有一个实体类,其中一个属性使用枚举类型,当我尝试持久化实体时,我得到以下异常:
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) 有人可以向我解释为什么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 一起使用的自定义约束检查来解决它,但不知怎的,我认为在整个故事中我都缺少一些东西.那么,我错过了什么?
我在使用@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用来处理控制器的连接,进行内容协商等.
我正在使用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可能不存在.如果我们尝试将其插入数据库,显然我们会得到一个与外键相关的异常.所以我假设我们必须验证这些问题并向客户端返回正确的消息,就像在常规属性验证中一样.
现在,我的主要问题是:
这些问题与Java有些相关,但我也希望对这些问题有一些新的看法.一些技术独立的.:)如果您可以在REST Web服务上为这些问题提供自己的解决方案,那就太棒了.
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) 如何设置一个bean验证约束,它List应该至少包含1并且最多包含10个元素?
以下都不起作用:
@Min(1)
@Max(10)
@Size(min=1, max=10)
private List<String> list;
Run Code Online (Sandbox Code Playgroud) bean-validation ×10
java ×8
jpa ×2
spring ×2
validation ×2
constraints ×1
data-binding ×1
hibernate ×1
javabeans ×1
jersey ×1
jersey-2.0 ×1
jsf ×1
jsf-2 ×1
precision ×1
rest ×1
spring-boot ×1
spring-mvc ×1
tomcat ×1