该解决方案最终归为
JacksonJaxbJsonProvider实现了JAX-RS
MessageBodyReader和的Jackson’s的子类
MessageBodyWriter。惊人的Dropwizard的方法使我受到启发。在此提供程序中,我们需要以某种方式注入Validator实例(我将Spring用于注入,将Hibernate
Validator用于JSR-303实现)。如果您使用Hibernate ORM,请不要忘记禁用实体验证,否则您将两次验证同一实体。不过,这可能是所需要的。
然后,在这个子类中
MessageBodyReader,我验证对象并抛出一个
InvalidEntityException来自验证器的错误的自定义。我还创建了一个JAX-
RS
ExceptionMapper<InvalidEntityException>,该映射将每个映射
InvalidEntityException到正确的HTTP响应中。在我的情况下,我返回了错误请求和包含错误描述的JSON对象。
请注意,此MessageBodyReader会检查
@Valid和
@Validated注释。这意味着它正确支持组。这很重要,因为我们可能不想在整个应用程序中进行相同的验证。例如,当我们要进行部分更新(PUT)时。或者,例如,id属性在POST请求中必须为null,但在其他所有地方都不为null。
数据完整性验证尚未完全处理。但是我正计划捕获数据库异常并将它们转换为我自己的域异常(例如
DataIntegrityException),因为它看起来效率更高且与我无关。
更新:
从JAX-RS
2开始,推荐的方法是使用其Bean验证支持。在这里检查:https : //jersey.java.net/documentation/latest/bean-
validation.html



