【发布时间】:2015-10-15 16:13:19
【问题描述】:
我正在使用 Google App Engine、Jersey、Objectify 和 Gson(以及其他一些小型库)构建一个应用程序。
我想使用@Valid 注释在资源中进行验证。但是,似乎没有执行任何实际验证。特别是,当将payee 设置为"123" 的Entry 发布到/entries 和/entries/nocheck 时,应用程序不会引发任何异常并且实体会保存在数据存储区中。
这是一个实体的sn-p:
@Entity
public class Entry {
@Id
private Long id;
private LocalDate date;
@com.sappenin.objectify.annotation.Money
private Money amount;
@NotNull @Pattern(regexp = "[a-zA-Z][a-zA-Z0-9]*") @Length(min = 5)
private String payee;
private String description;
private String note;
//...
}
这是资源的sn-p:
@Path("/entries")
@Produces(MediaType.APPLICATION_JSON)
public class TestApi {
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response create(@Valid Entry entry) {
OfyService.ofy().save().entities(entry).now();
return Response.ok(entry).build();
}
@POST
@Path("/nocheck")
@Consumes(MediaType.APPLICATION_JSON)
public Response createNoCheck(Entry entry) {
OfyService.ofy().save().entities(entry).now();
return Response.ok(entry).build();
}
}
这是应用程序:
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages(
"it.newfammulfin.model",
"it.newfammulfin.api",
"it.newfammulfin.api.util");
}
}
注意 pom.xml 包含这个依赖:
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-bean-validation</artifactId>
<version>2.22.1</version>
</dependency>
这应该会导致 due to the auto-discovery feature 无需进一步配置即可启用验证。
我错过了什么?
更新
我在资源中添加了一个明确验证实体的方法:
@POST
@Path("validate")
@Consumes(MediaType.APPLICATION_JSON)
public Response testValidate(@Valid Entry entry) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
System.out.println("validator is "+validator.getClass().getName());
System.out.println(validator.validate(entry));
return Response.ok(entry).build();
}
通过调用validate() 进行验证有效。然而,在实际调用 testValidate() 之前的验证不会。
顺便说一句,我不得不使用 JSR303 Bean Validation 的 Apache BVal 实现,因为 Hibernate Validator 和 Google App Engine 之间存在一些 issues。
【问题讨论】:
-
我确认:提到
jersey-bean-validation依赖是至关重要的。如果我是你,我会仔细检查我是否真的在使用 Jersey 2.x(因为从 2.x 开始添加了对验证的支持)。 -
是的,我读到了版本问题。我正在使用 Jersey 2.2。
标签: java validation google-app-engine jersey