【问题标题】:Jersey App Engine: entity validation not workingJersey App Engine:实体验证不起作用
【发布时间】: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


【解决方案1】:

在 jersey 2.X 中,您必须注册您的扩展。然而,验证似乎是个例外,如here 所述。无论如何我都会尝试一下,看看你可以配置什么:

  • CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE
  • ServerProperties.FEATURE_AUTO_DISCOVERY_DISABLE
  • ServerProperties.BV_FEATURE_DISABLE

您的应用程序类可能如下所示:

public class MyApplication extends ResourceConfig {
  public MyApplication() {
    register(ValidationFeature.class);
    property(ServerProperties.BV_SEND_ERROR_IN_RESPONSE, true);
    property(ServerProperties.BV_DISABLE_VALIDATE_ON_EXECUTABLE_OVERRIDE_CHECK, true)
    packages(
            "it.newfammulfin.model",
            "it.newfammulfin.api",
            "it.newfammulfin.api.util");
  }
}

【讨论】:

  • 您提出的解决方案确实移动了一些东西,但实际上并没有解决我的问题。首先,我得到了一个ClassNotFoundException,我通过添加jersey-guava maven 依赖项解决了这个问题。现在我看到一个NoSuchMethodError 抱怨javax.validation.Configuration.getBootstrapConfiguration() 的方法。
  • hm 请从您的 pom.xml 添加所有与球衣相关的依赖项。这当然看起来像是缺少依赖项。
  • 完整项目在github,这里是pom.xml(链接指向当前版本,供以后参考)。
  • 我还有以下内容:org.glassfish.jersey.core.jersey-client、org.glassfish.jersey.bundles.jaxrs-ri - 后者听起来很有希望。
  • 是的。所以试试mvn dependency:tree 看看是否以及为什么会出现“坏版本”。
【解决方案2】:

我通过仔细清理我的pom.xml 并更新所有版本解决了这个问题。正确的依赖如下(我使用的是1.9.27版本的Google App Engine):

<dependency>
    <groupId>com.google.appengine</groupId>
    <artifactId>appengine-api-1.0-sdk</artifactId>
    <version>${appengine.version}</version>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.22.1</version>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.4</version>
</dependency>
<dependency>
    <groupId>com.googlecode.objectify</groupId>
    <artifactId>objectify</artifactId>
    <version>5.1.8</version>
</dependency>
<dependency>
    <groupId>org.joda</groupId>
    <artifactId>joda-money</artifactId>
    <version>0.10.0</version>
</dependency>
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.8.2</version>
</dependency>
<dependency>
    <groupId>com.sappenin.objectify</groupId>
    <artifactId>objectify-utils</artifactId>
    <version>5.1.3</version>
</dependency>
<dependency>
    <groupId>com.fatboyindustrial.gson-jodatime-serialisers</groupId>
    <artifactId>gson-jodatime-serialisers</artifactId>
    <version>1.2.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.ext</groupId>
    <artifactId>jersey-bean-validation</artifactId>
    <version>2.22.1</version>
</dependency>
<dependency>
    <groupId>de.odysseus.juel</groupId>
    <artifactId>juel-api</artifactId>
    <version>2.2.7</version>
</dependency>
<dependency>
    <groupId>de.odysseus.juel</groupId>
    <artifactId>juel-impl</artifactId>
    <version>2.2.7</version>
</dependency>

注意最后两个,关于juel,需要避免this problem(参见关于message参数的评论):另见this related solved issue关于Google App Engine和juel之间的不兼容。

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多