我一直在寻找一种使我的JAX-RS API更具可读性的方法,并且遇到了Google的“自定义方法”方法:
https://cloud.google.com/apis/design/custom_methods
之所以寻找它,是因为我的某些实体执行的动作比我用传统HTTP动词表达的动作更多。 Google模式是在URI的末尾使用冒号(:
),将实体/集合与所需的操作分开。
我试图将此模式应用于简单的Jersey资源,只是为了测试如何完成。我有一个用StudentDetailsResource
注释的资源类@Path("students/{studentId}")
和一些用@Path
注释的方法。
如果我的方法在自定义方法之前有另一个实体,则一切正常。假设enroll方法带有注释
@Path("subjects/{subjectId}:enroll")
。
当操作恰好在资源类URI之后时,问题就出现了,因为@Path
使用了prefixWithSlash
所有子资源的URI模板。因此,如果我有一个dropout方法,则注释看起来像@Path(":dropout")
,但是URI模板将变成/students/{studentId}/:dropout
,这个/:
会在匹配阶段中断。
我已经了解了Jersey Providers和ResourceDelegates,但找不到替代prefixWithSlash
的URI模板默认操作的方法。
问题是:如何应用Google的自定义方法或如何避免Jersey的默认prefixWithSlash
行为?
注意:我知道这是一个愚蠢的示例,还有其他解决此特定情况的方法,但是我有更复杂的情况,可以从自定义方法中受益。