【发布时间】:2012-02-28 14:25:07
【问题描述】:
是否可以在 JAX-RS 资源上有效使用 JSR303(Bean Validation)注解?
例如,如果我有一个资源成员,我已经注释了@NotEmpty,如果不满足这个约束,就会向客户端生成一个错误?
这似乎是显而易见的事情,但也很高兴被告知更好的方法(我不想将验证移至 ORM/数据库级别)
【问题讨论】:
标签: java jax-rs bean-validation apache-wink
是否可以在 JAX-RS 资源上有效使用 JSR303(Bean Validation)注解?
例如,如果我有一个资源成员,我已经注释了@NotEmpty,如果不满足这个约束,就会向客户端生成一个错误?
这似乎是显而易见的事情,但也很高兴被告知更好的方法(我不想将验证移至 ORM/数据库级别)
【问题讨论】:
标签: java jax-rs bean-validation apache-wink
您真的是要验证资源成员吗?通常资源成员以这种或另一种方式注入(它可以是上下文、实体或路径/查询/矩阵参数),只要 JAX-RS 框架正常工作,您就会正确注入这些成员。
我个人认为验证实体更有意义,因为它是通过线路到达的,由 MessageBodyReader 填充,基本上你不知道里面是什么,对吧?
因此,如果您决定验证实体,您可以采取以下几种方法:
AFAIK,Apache Wink 不支持内置验证。您可以实现一个处理程序。见DeploymentConfiguration.initRequestHandlersChain()。它支持添加用户处理程序。在您的处理程序中,您可以执行任何验证。我什至认为,如果您提供此代码,Wink 社区会很高兴。
这种方法的唯一问题 - 它绑定到 Apache Wink。如果您决定迁移到不同的 JAX-RS 框架,它将无法正常工作。
另一种方法是在您自己的MessageBodyReader 中进行此验证。您需要做的就是为您的实体注册一个特殊的阅读器并验证里面的实体。您仍然可以通过使用@Context Providers.getMessageBodyReader() 来利用标准 MessageBodyReaders(如 JAXB 或 Jackson)。这种方法的优点在于它是标准的 JAX-RS。将 MessageBodyReaders 用于非设计用途的坏处。
最简单的方法是在每个资源方法的第一行验证实体。它会造成一些代码重复,但有时简单会胜出。
【讨论】:
一个解决方案——当我使用 Spring 2.5.x 时,我可以创建一个实现 InitializingBean 并委托给 Hibernate 的验证器的包装类。它有效 - 有更好的解决方案吗?
【讨论】: