Java 组合注释中的JAX-RS@Path

Java 组合注释中的JAX-RS@Path,java,spring,annotations,jax-rs,Java,Spring,Annotations,Jax Rs,这一点似乎相对简单。我正在处理组合注释,并尝试执行以下操作: @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented @Path("") public @interface TestAnnotation { @AliasFor(annotation = Path.class, attribute = "value") String path(); } 这是行不通的。当我这样使用它时: @Pa

这一点似乎相对简单。我正在处理组合注释,并尝试执行以下操作:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Path("")
public @interface TestAnnotation {
  @AliasFor(annotation = Path.class, attribute = "value")
  String path();
}
这是行不通的。当我这样使用它时:

@Path("")
public class MyResource {
  @POST
  @Consumes(MediaType.APPLICATION_JSON)
  @TestAnnotation(path = "/things")
  public void postIt(Thing myThing) {
    // Do various things and then return a Response
  }
}
…作为回报,我收到了
405
。如果我这样做:

// Remove class-level @Path
// @Path("")
public class MyResource {
  @POST
  @Consumes(MediaType.APPLICATION_JSON)
  @TestAnnotation(path = "/things")
  public void postIt(Thing myThing) {
    // Do various things and then return a Response
  }
}
…作为回报,我收到了一个
404


关于
@Path
或者
@Path
有一个必需的
属性,导致它无法正常工作,我不知道如何补救。

经过进一步的实验和研究,我试图做的似乎是不可能的

后续尝试利用Jackson的
@JsonView
,并通过Spring的
@AliasFor
,通过我的合成注释将其公开,但同样失败

我花了一些时间思考注释是如何工作的,并考虑了peeskillet关于编译与处理的评论,我得出结论,Jersey和Jackson都必须使用注释处理器,基本上只调用“Method.isAnnotationPresent()”来检测相关注释。Spring的
@AliasFor
很可能不会编译或将带别名的元注释编织到目标方法的字节码中,因此处理器不会找到它们

我个人对这个问题的解决方案是完全放弃JAX-RS,使用Spring的
@RequestMapping
,它可以在组合注释中使用别名,并接受Jackson的
@JsonView
根本无法集成到组合注释中

显然,对于大多数人来说,这不是一个理想的解决方案,尤其是那些拥有大型、已经建立的系统的人。在这种情况下,组合注释的想法很可能在JAX-RS出现之前很久就被放弃了


因此,如果有人对这个问题有更深入的了解,或者Spring团队的直接成员想插话,请放心。

您的类需要一个
@Path
,否则它将不会被发现为资源类,即永远不会注册,即404@peeskillet这并不能解释如果我包括类级别的
@Path
,我得到的
405
。你知道405是什么意思吗?你还知道
@AliasFor
是否由Spring编译成不同的字节码,或者它是否只是由Spring处理?如果是后者,我不明白为什么它应该被JAX-RS识别。这是两个完全不同的处理引擎。@peeskillet据我所知,
405
是一个简单的“不允许的方法”,这就是为什么它如此令人困惑;我正在将
POST
发送到
POST
端点。我只能猜测,它是出于某种原因,试图击中其他端点路径。至于
@AliasFor
,我只能说我真正的“
TestAnnotation
”比这个简化的示例涉及更多与JAX-RS相关的元注释,并且它们确实起作用-
@Path
是唯一不合作的。