验证JAX-RS方法的输入参数

时间:2016-09-05 21:35:10

标签: rest jax-rs

我正在编写JAX-RS API,并使用Response类作为每个方法的返回类型。但是,我正试图找出验证参数的“最佳”方法。

之前我编写了一些REST API,并且通常在方法中有自定义验证例程,然后在其中有一个带有验证消息的自定义返回对象。我想我想在这里做同样的事情,但这是“首选”吗?

我知道有@NotNull等注释可以应用并提供自定义验证消息,但我真的不喜欢最终看的方式。

所以,我所做的是我编写了一个返回对象bean,我将其用作我的JAX-RS响应的.entity(),并且我将所有验证消息放在那里。我为成功和失败使用相同的返回对象,但这只是我在那里填充哪些参数的问题,具体取决于场景。这是一个内部API,因此不会有任何外部消费者。我只想标准化返回类型,因此它总是返回相同的“对象”。

这听起来像是一种好方法吗?我在REST API最佳实践上有点生疏,我一直在疯狂地搜索,但没有真正得出任何最佳实践结论。

1 个答案:

答案 0 :(得分:1)

RestAPI的输入验证不是直截了当的。有很多互联网资源,但没有一个能够做到这一点的优雅方式。

正如您所提到的,可以使用jax-rs库的不同实现的注释来完成简单的输入验证。 这些注释可以很复杂,因为支持正则表达式。这将帮助您涵盖比@NotNull@size等更多的验证案例。 这些注释还接受消息作为输入,这将帮助您自定义必须返回给用户的消息。

这些注释可能看起来不太性感(特别是涉及正则表达式时);但我仍然更喜欢写自己的验证器。

验证的另一个问题是有点棘手的是你想要验证约束(更像是逻辑),

例如,您有这样的要求:如果参数A的值为X,则参数B必须不为空,否则参数B为空是可以的。 这不是您可以使用通常的javax.validation.constraints.*处理的事情。我没有找到一个能够解决这个问题的好库。

看看

javax.validation.ConstraintViolation 

您可以编写自己的自定义验证逻辑,只要库拦截对您的API的调用,就会调用该逻辑。