组合注释中的JAX-RS @Path

时间:2015-12-29 00:10:10

标签: java spring annotations jax-rs

这个看起来相对简单。我正在搞乱注释,我试图做以下事情:

@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具有必需value属性导致此功能无法正常运行的事实,我不知道如何解决此问题。< / p>

1 个答案:

答案 0 :(得分:0)

经过进一步的实验和研究,看来我试图做的事实上是不可能的。

利用杰克逊的{ ... access_type='offline', prompt='select_account consent' } 进行了后续尝试,并通过Spring的@JsonView通过我的注释来揭露它,而这也未能发挥作用。

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

我对此问题的个人解决方案是完全删除JAX-RS并使用Spring的@AliasFor,其中可以在组合注释中别名,并且只接受杰克逊的@RequestMapping根本无法整合到合成的注释中。

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

因此,如果有人对此问题有更深入的了解,或者直接来自Spring团队的人想要加入,请随意。