提交 aebc2c45 编写于 作者: T Tomasz Bak

Add @Http annotations that aggregates HTTP methods (@GET/@POST/...),

path and possibly other values if required in the future.
上级 895eeff5
......@@ -2,9 +2,8 @@ package com.netflix.ribbonclientextensions.typedclient;
import com.netflix.ribbonclientextensions.RibbonRequest;
import com.netflix.ribbonclientextensions.typedclient.annotation.Content;
import com.netflix.ribbonclientextensions.typedclient.annotation.GET;
import com.netflix.ribbonclientextensions.typedclient.annotation.POST;
import com.netflix.ribbonclientextensions.typedclient.annotation.Path;
import com.netflix.ribbonclientextensions.typedclient.annotation.Http;
import com.netflix.ribbonclientextensions.typedclient.annotation.Http.HttpMethod;
import com.netflix.ribbonclientextensions.typedclient.annotation.TemplateName;
import com.netflix.ribbonclientextensions.typedclient.annotation.Var;
......@@ -25,15 +24,10 @@ import static java.lang.String.*;
* @author Tomasz Bak
*/
public class MethodTemplate {
public static enum HttpMethod {
GET,
POST
}
private static final MethodTemplate[] EMPTY_ARRAY = new MethodTemplate[]{};
private final String templateName;
private final HttpMethod httpMethod;
private final Http.HttpMethod httpMethod;
private final Method method;
private final String path;
private final String[] paramNames;
......@@ -42,9 +36,10 @@ public class MethodTemplate {
public MethodTemplate(Method method) {
this.method = method;
this.httpMethod = extractHttpMethod();
Http httpAnnotation = extractHttpAnnotation();
this.httpMethod = httpAnnotation.method();
this.path = httpAnnotation.path();
this.templateName = extractTemplateName();
this.path = extractPathInfo();
Object[] nameIdxPair = extractParamNamesWithIndexes();
this.paramNames = (String[]) nameIdxPair[0];
this.valueIdxs = (int[]) nameIdxPair[1];
......@@ -92,18 +87,14 @@ public class MethodTemplate {
return list.toArray(EMPTY_ARRAY);
}
private HttpMethod extractHttpMethod() {
Annotation annotation = method.getAnnotation(GET.class);
if (null != annotation) {
return HttpMethod.GET;
}
annotation = method.getAnnotation(POST.class);
if (null != annotation) {
return HttpMethod.POST;
private Http extractHttpAnnotation() {
Http annotation = method.getAnnotation(Http.class);
if (null == annotation) {
throw new IllegalArgumentException(format(
"Method %s.%s misses @Http annotation",
method.getDeclaringClass().getSimpleName(), method.getName()));
}
throw new IllegalArgumentException(format(
"Method %s.%s does not specify HTTP method with @GET or @POST annotation",
method.getDeclaringClass().getSimpleName(), method.getName()));
return annotation;
}
private String extractTemplateName() {
......@@ -111,11 +102,6 @@ public class MethodTemplate {
return (annotation != null) ? annotation.value() : null;
}
private String extractPathInfo() {
Path annotation = method.getAnnotation(Path.class);
return (annotation != null) ? annotation.value() : null;
}
private Object[] extractParamNamesWithIndexes() {
List<String> nameList = new ArrayList<String>();
List<Integer> idxList = new ArrayList<Integer>();
......
......@@ -5,7 +5,19 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author Tomasz Bak
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GET {
public @interface Http {
enum HttpMethod {
GET,
POST
};
HttpMethod method();
String path() default "";
}
package com.netflix.ribbonclientextensions.typedclient.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface POST {
}
package com.netflix.ribbonclientextensions.typedclient.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Path {
public String value() default "";
}
......@@ -47,7 +47,7 @@ public class MethodTemplateTest {
@Test(expected = IllegalArgumentException.class)
public void testMissingHttpMethod() throws Exception {
new MethodTemplate(methodByName(SampleBrokenTypedMovieService.class, "missingHttpMethod"));
new MethodTemplate(methodByName(SampleBrokenTypedMovieService.class, "missingHttpAnnotation"));
}
@Test(expected = IllegalArgumentException.class)
......
......@@ -2,18 +2,19 @@ package com.netflix.ribbonclientextensions.typedclient.sample;
import com.netflix.ribbonclientextensions.RibbonRequest;
import com.netflix.ribbonclientextensions.typedclient.annotation.Content;
import com.netflix.ribbonclientextensions.typedclient.annotation.GET;
import com.netflix.ribbonclientextensions.typedclient.annotation.Http;
import com.netflix.ribbonclientextensions.typedclient.annotation.Http.HttpMethod;
/**
* @author Tomasz Bak
*/
public interface SampleBrokenTypedMovieService {
@GET
@Http(method = HttpMethod.GET)
public Movie returnTypeNotRibbonRequest();
public Movie missingHttpMethod();
public Movie missingHttpAnnotation();
@GET
@Http(method = HttpMethod.GET)
public RibbonRequest<Void> multipleContentParameters(@Content Movie content1, @Content Movie content2);
}
......@@ -3,10 +3,9 @@ package com.netflix.ribbonclientextensions.typedclient.sample;
import com.netflix.ribbonclientextensions.RibbonRequest;
import com.netflix.ribbonclientextensions.typedclient.annotation.Cache;
import com.netflix.ribbonclientextensions.typedclient.annotation.Content;
import com.netflix.ribbonclientextensions.typedclient.annotation.GET;
import com.netflix.ribbonclientextensions.typedclient.annotation.Http;
import com.netflix.ribbonclientextensions.typedclient.annotation.Http.HttpMethod;
import com.netflix.ribbonclientextensions.typedclient.annotation.Hystrix;
import com.netflix.ribbonclientextensions.typedclient.annotation.POST;
import com.netflix.ribbonclientextensions.typedclient.annotation.Path;
import com.netflix.ribbonclientextensions.typedclient.annotation.TemplateName;
import com.netflix.ribbonclientextensions.typedclient.annotation.Var;
......@@ -18,19 +17,16 @@ public interface SampleTypedMovieService {
@TemplateName("findMovieById")
@Cache(key = "movie.{id}")
@GET
@Path("/movies/{id}")
@Http(method = HttpMethod.GET, path = "/movies/{id}")
RibbonRequest<Movie> findMovieById(@Var("id") String id);
@TemplateName("findMovie")
@Cache(key = "movie#name={name},author={author}")
@GET
@Path("/movies?name={name}&author={author}")
@Http(method = HttpMethod.GET, path = "/movies?name={name}&author={author}")
RibbonRequest<Movie> findMovie(@Var("name") String name, @Var("author") String author);
@TemplateName("registerMovie")
@Hystrix(name = "postMovie")
@POST
@Path("/movies")
@Http(method = HttpMethod.POST, path = "/movies")
RibbonRequest<Void> registerMovie(@Content Movie movie);
}
......@@ -3,10 +3,9 @@ package com.netflix.ribbonclientextensions.typedclient.sample;
import com.netflix.ribbonclientextensions.RibbonRequest;
import com.netflix.ribbonclientextensions.typedclient.annotation.Cache;
import com.netflix.ribbonclientextensions.typedclient.annotation.Content;
import com.netflix.ribbonclientextensions.typedclient.annotation.GET;
import com.netflix.ribbonclientextensions.typedclient.annotation.Http;
import com.netflix.ribbonclientextensions.typedclient.annotation.Http.HttpMethod;
import com.netflix.ribbonclientextensions.typedclient.annotation.Hystrix;
import com.netflix.ribbonclientextensions.typedclient.annotation.POST;
import com.netflix.ribbonclientextensions.typedclient.annotation.Path;
import com.netflix.ribbonclientextensions.typedclient.annotation.Var;
import io.netty.buffer.ByteBuf;
......@@ -17,17 +16,14 @@ import io.netty.buffer.ByteBuf;
public interface SampleUntypedMovieService {
@Cache(key = "movie.{id}")
@GET
@Path("/movies/{id}")
@Http(method = HttpMethod.GET, path = "/movies/{id}")
RibbonRequest<ByteBuf> findMovieById(@Var("id") String id);
@Cache(key = "movie#name={name},author={author}")
@GET
@Path("/movies?name={name}&author={author}")
@Http(method = HttpMethod.GET, path = "/movies?name={name}&author={author}")
RibbonRequest<ByteBuf> findMovie(@Var("name") String name, @Var("author") String author);
@Hystrix(name = "postMovie")
@POST
@Path("/movies")
@Http(method = HttpMethod.POST, path = "/movies")
RibbonRequest<Void> registerMovie(@Content ByteBuf movie);
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册