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属性,导致它无法正常工作,我不知道如何补救

经过进一步的实验和研究,我想做的似乎根本不可能。

后续尝试使用Jackson的@JsonView,并通过Spring的@AliasFor通过我的合成注释将其公开,但这也失败了。

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

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

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

因此,如果有人对这个问题有更多的了解,或者Spring团队的直接成员想参与进来,请放心。

最新更新