使用JSR303验证JAX-RS(Apache Wink)资源?

时间:2012-02-28 14:25:08

标签: java jax-rs bean-validation apache-wink

是否可以在JAX-RS资源上有效使用JSR303(Bean Validation)注释?

例如,如果我有一个资源成员,我注释了@NotEmpty,如果不满足此约束,则会向客户端生成错误?

这似乎是显而易见的事情,但也很高兴被告知更好的方法(我不想将验证移到ORM /数据库级别)

2 个答案:

答案 0 :(得分:3)

您的意思是验证资源成员吗?通常资源成员以这种方式或其他方式注入(它是上下文,实体或路径/查询/矩阵参数),只要JAX-RS框架工作,您就可以正确地注入这些成员。

我个人认为验证实体更有意义,因为它已经通过电线到达,由MessageBodyReader填充,基本上你不知道里面是什么,对吗?

因此,如果您决定验证实体,可以采取以下几种方法:

  1. AFAIK,Apache Wink不支持内置验证。您可以实现处理程序。见DeploymentConfiguration.initRequestHandlersChain()。它支持添加用户处理程序。在您的处理程序中,您可以执行任何验证。我甚至认为,如果您提供此代码,Wink社区将会很高兴 这种方法唯一的问题 - 它与Apache Wink绑定。如果您决定转移到不同的JAX-RS框架,它将无法工作。

  2. 另一种方法是在您自己的MessageBodyReader中进行此验证。您需要做的就是为您的实体注册一个特殊的阅读器并验证其中的实体。您仍然可以使用@Context Providers.getMessageBodyReader()来利用标准的MessageBodyReaders(如JAXB或Jackson)。这种方法的好处在于它是标准的JAX-RS。你使用MessageBodyReaders来解决它们不适合的问题。

  3. 最简单的方法是在每个资源方法的第一行验证实体。它会创建一些代码重复,但有时简单获胜。

答案 1 :(得分:1)

一个解决方案 - 因为我使用Spring 2.5.x,我可以创建一个实现InitializingBean的包装类,并委托给Hibernate的验证器。它有效 - 有更好的解决方案吗?