是否可以在 JAX-RS 资源上有效使用 JSR303(Bean 验证)注释?
因此,例如,如果我有一个资源成员,我已经注释了@NotEmpty,如果不满足此约束,则生成一个错误返回给客户端?
这似乎是显而易见的事情,但也很高兴被告知更好的方法(我不想将验证下移到 ORM/数据库级别)
最佳答案
您真的是要验证资源成员吗?通常,资源成员以这种或另一种方式注入(inject)(它是上下文、实体或路径/查询/矩阵参数),只要 JAX-RS 框架正常工作,您就会正确注入(inject)这些成员。
我个人认为验证实体更有意义,因为它是通过线路到达的,由 MessageBodyReader 填充,基本上您不知道里面有什么,对吧?
因此,如果您决定验证实体,可以采用多种方法:
据我所知,Apache Wink 不支持内置验证。您可以实现一个处理程序。请参阅
DeploymentConfiguration.initRequestHandlersChain()
。它支持添加用户处理程序。在您的处理程序中,您可以执行任何验证。我什至认为,如果您贡献此代码,Wink 社区会很高兴。
这种方法的唯一问题是它绑定(bind)到 Apache Wink。如果您决定迁移到不同的 JAX-RS 框架,它将不起作用。另一种方法是在您自己的
MessageBodyReader
中进行此验证。您需要做的就是为您的实体注册一个特殊的阅读器并验证其中的实体。您仍然可以通过使用@Context Providers.getMessageBodyReader()
来利用标准 MessageBodyReader(如 JAXB 或 Jackson)。这种方法的优点在于它是标准的 JAX-RS。糟糕的是,您将 MessageBodyReader 用于其设计目的之外的用途。最简单的方法是验证每个资源方法第一行中的实体。它会产生一些代码重复,但有时简单会胜出。
关于java - 使用 JSR303 验证 JAX-RS (Apache Wink) 资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9483677/