我正在使用Web库并创建一些注释-@ Get,@ Put,@ Post,@ Delete等。它们都具有相同的属性,因此可以将它们全部转换为某些“超级”注释,以使与他们的合作更加轻松?这是我的代码现在的样子:
public void createGetRoute(Get get) {
this.path = get.path()
this.method = "GET"
}
public void createPutRoute(Put put) {
this.path = put.path()
this.method = "PUT"
}
// ... And so on
我想做的是:
public void createRoute(Route route) {
this.path = route.path()
this.method = route.method()
}
Route
是所有其他注释的“超类”。我知道我们不能扩展@interfaces
,但是还有另一种方法可以使我的代码更干燥吗?
答案 0 :(得分:1)
Spring框架利用了公共请求注释known as @RequestMapping
,该注释接受一个方法类型和其他一些必要的参数。
在框架的较新版本中,存在方便注释,例如@GetMapping
,它们应用了具有合理默认值的相同@RequestMapping
注释。
最好从您能想到的最通用的路线注释开始,并且仅,如果您考虑考虑将它们更方便地细分为更小的方法,则 。 / p>
答案 1 :(得分:0)
因此,在研究了其他几个框架的工作方式之后,我决定采用类似的模式。我从一个普通的@Route
类开始:
public @interface Route {
String[] value() default {"/"};
String[] pattern() default {};
String[] consumes() default {};
String[] produces() default {};
HttpMethod method() default HttpMethod.GET;
boolean blocking() default false;
int order() default 0;
}
基本上,将其复制/粘贴到代表每种HTTP方法的类中-GET,POST,PUT等。
然后,我使用了一些反射来确定在构建路由表时应该分配给路由的HTTP方法:
RouteProperties fromAnnotation(Annotation annotation) {
Class<? extends Annotation> type = annotation.annotationType();
HttpMethod method;
switch (type.getSimpleName()) {
case "Get":
method = GET;
break;
case "Post":
method = POST;
break;
case "Put":
method = PUT;
break;
//...
case "Route":
method = invoke("method", annotation, HttpMethod.class);
break;
default:
method = GET;
}
this.method = method;
您在上方看到的invoke()
方法是如何获取我感兴趣的每个属性的值。基本上看起来像这样:
private <T> T invoke(String methodName, Object instance, Class<T> returnType) {
T result;
try {
result = (T) instance.getClass().getMethod(methodName).invoke(instance);
} // Catch block
return result;
}
除了在多个文件中复制/粘贴Route类的所有属性外,这种方法还大大减少了我以前拥有的代码量,并且更易于维护。
谢谢大家的帮助!