这个似乎相对简单。我正在摆弄合成的注释,我正试图做以下事情:
@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团队的直接成员想参与进来,请放心。