Java Jersey/REST:将请求委托给不同的子资源而不复制代码?

Java Jersey/REST:将请求委托给不同的子资源而不复制代码?,java,jersey,jax-rs,Java,Jersey,Jax Rs,我们创建了一个资源,如: @Path("whatever") public class WhateverResource { @POST public Response createWhatever(CreateBean bean) { ... @DELETE @Path("/{uuid}") public void deleteWhatever(@PathParam("uuid") UUID uuid) { ... @Path("whatever") public class Whate

我们创建了一个资源,如:

@Path("whatever")
public class WhateverResource {

@POST
public Response createWhatever(CreateBean bean) { ...

@DELETE
@Path("/{uuid}")
public void deleteWhatever(@PathParam("uuid") UUID uuid) { ...
@Path("whatever")
public class WhateverResourceIsntAvailable {

@POST
public Response createWhatever(CreateBean bean) { 
  throw 501

@DELETE
@Path("/{uuid}")
public void deleteWhatever(@PathParam("uuid") UUID uuid) { 
  throw 501
等着去拿,去拿,去拿

现在我们认为我们需要检查底层功能是否实际启用。一次检查,当它失败时,所有操作只会导致501

我的第一个想法是复制现有资源,如:

@Path("whatever")
public class WhateverResource {

@POST
public Response createWhatever(CreateBean bean) { ...

@DELETE
@Path("/{uuid}")
public void deleteWhatever(@PathParam("uuid") UUID uuid) { ...
@Path("whatever")
public class WhateverResourceIsntAvailable {

@POST
public Response createWhatever(CreateBean bean) { 
  throw 501

@DELETE
@Path("/{uuid}")
public void deleteWhatever(@PathParam("uuid") UUID uuid) { 
  throw 501
因此,两个资源都指定了完全相同的操作。导致我们无法(轻松地)在需要注册资源的时间点调用该检查的问题

除此之外,这种复制看起来并不优雅,我想知道是否有一种“更规范”的方法来解决这个问题

编辑:另一个选项是将检查添加到现有资源中,添加到每个资源中,但这意味着:对每个操作执行检查。在添加新操作时很容易忘记

我的设想是:

  • 注册的“基本资源”
  • 在该资源上调用任何操作时,请求都应该“委派”,具体取决于基础功能
  • 或者是一个只提供501的资源
  • 或者是“真正”的资源来做真正的工作

理想情况下,无需重复检查代码或重复操作端点规范。

根据用户Samsotha的建议,我实现了一个简单的,然后通过“连接”的方法,如:

以及:

这种方法的主要优点是,可以注释单个操作,也可以注释整个资源,例如my
WhateverResource
。后者将确保该资源中的任何操作都要通过过滤器


(更多详细信息可以在任何像样的Jersey教程中找到,如上一篇)

我不明白,如果(某些条件)抛出501进行正常处理,这不应该是一个简单的
?老实说,我不太明白你打算如何用你目前的方法解决这个问题:(你为什么需要复制它们?你脑子里有覆盖吗?请给我解释一下可能是什么?困扰我的是
@Path(“随便”)
会复制-至少在春天-你显然不能复制,因为你映射到同一条路径…我同意@Eugene:使用相同的Rest端点应该是不可能的(有或没有Spring)。您可能应该使用JAX RS拦截器/过滤器。我现在没有时间写答案,但您可以这样做:)看看。当然,现在您必须“记住”来注释您的类…;)当然,但这是一次性的。当然:更直接。现在我们有了“工作”这个概念…每当我们需要此类筛选时,我们都会提前知道,并在首次编写资源类时对其进行注释。这与记住注释类中的每个新方法非常不同。我的观点不同。创建一个安全网测试…扫描路径上的每个类(当然是在某个包中)并查看哪些组件使用
@Path
进行注释,如果它们缺少
@MyFilter
-fails,这不是我们的要求。我们有一个现有组件,该组件通过附加API端点得到增强。对于新组件,我们必须确保它们选中“启用”,但不适用于旧的、现有的API。因此,我们只筛选选定的类,大多数不筛选!