我似乎遇到了一些关于Hibernate验证的问题。考虑以下端点方法(在groovy中):
@POST
@Path("authenticate")
authenticate(User entity) {
if (entity == null) return Response.status(Response.Status.BAD_REQUEST).build()
def validation = Validator.validate(entity)
if(!validation.valid) {
return Response.status(Response.Status.BAD_REQUEST).entity(validation.invalidationTokens).build()
}
return Response.ok(entity).build()
}
这段代码可以工作,但每次我调用这个端点时,处理大约需要300毫秒,然后下一个请求将再次非常快,然后再慢,等等......端点类是应用程序作用域,正如我首先想到的那样,可能是因为它再次创建了一个新实例,或者其他东西,但不是它。
我已经确定这是因为验证器。当我在上面发布的端点方法中省略验证时,它一直很快。
下面是我用来验证和返回违反约束的验证器类。
private static javax.validation.Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
private Validator() {
}
public static <E> ValidationResult validate(E element, Class<?> ... groups) {
return ValidationResult.fromConstraintViolations(validator.validate(element, groups));
}
目前,在User实体中验证的唯一字段是:
@NotNull(message = "username.empty")
private String username;
我通常会使用注入来获取验证器,但我似乎无法使用它来处理此配置。
我使用以下相关的maven依赖项:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
<version>2.22.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.0.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.4.Final</version>
</dependency>
更新1:
我没有提到过我通过Gson对json进行序列化。我在我的基于gson的编写器中修修补补,我似乎已经消除了不一致性(但我实际上没有改变任何程序)。当我确定这是解决方法时,我会将此作为答案发布。