泽西岛App Engine:实体验证不起作用 - java

我正在使用Google App Engine,Jersey,Objectify和Gson(以及其他一些小型库)构建应用程序。

我想使用@Valid批注在资源中进行验证。但是,似乎没有执行任何实际的验证。特别是,当将Entry设置为payee"123"设置为/entries/entries/nocheck时,应用程序不会引发任何异常,并且实体将保存在数据存储中。

这是实体的片段:

@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;

  //...
}

这是该资源的片段:

@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()的实际调用之前的验证没有。
顺便说一句,由于Hibernate Validator和Google App Engine之间的某些Apache BVal,我不得不使用JSR303 Bean验证的issues实现。

参考方案

在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");
  }
}

使用对象化进行多对多关系? - java

我正在将我的应用程序从关系数据库移到对象化/谷歌应用程序引擎。该应用程序具有如下所示的关系:一个Message可以发送给许多Users。每个User可以有多个Message寻址到它们。我需要能够扫描寻址到特定Message的所有User。我该如何使用Objectify? 参考方案 有很多方法可以做到这一点。您可以在用户对象中保存消息列表。由于不需要进行查询,…

与JDO和GAE的多对一关系 - java

我搜索了整个站点但是,甚至没有一个示例说明如何使用jdo实现多对一关系。https://developers.google.com/appengine/docs/java/datastore/jdo/relationships但我不知道该怎么做。可以说我有这个数据库:Cars(CarID,OwnerID,...) Owner(OwnerID,...) 我想为…

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…