diff --git a/retrofit/src/main/java/retrofit2/IgnoreParameter.java b/retrofit/src/main/java/retrofit2/IgnoreParameter.java new file mode 100644 index 0000000000..341663abea --- /dev/null +++ b/retrofit/src/main/java/retrofit2/IgnoreParameter.java @@ -0,0 +1,19 @@ +package retrofit2; + + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * Use this meta-annotation on an annotation you want to use on a service method parameter to cause + * retrofit to ignore the parameter when processing a request. + */ +@Documented +@Target(TYPE) +@Retention(RUNTIME) +public @interface IgnoreParameter { +} diff --git a/retrofit/src/main/java/retrofit2/ParameterHandler.java b/retrofit/src/main/java/retrofit2/ParameterHandler.java index 6084fc66eb..0a3190fbf1 100644 --- a/retrofit/src/main/java/retrofit2/ParameterHandler.java +++ b/retrofit/src/main/java/retrofit2/ParameterHandler.java @@ -446,4 +446,13 @@ void apply(RequestBuilder builder, @Nullable T value) { builder.addTag(cls, value); } } + + static final class NoOp extends ParameterHandler { + + @Override + void apply(RequestBuilder builder, @org.jetbrains.annotations.Nullable T value) throws IOException { + // do nothing + } + } + } diff --git a/retrofit/src/main/java/retrofit2/RequestFactory.java b/retrofit/src/main/java/retrofit2/RequestFactory.java index bea554efae..0db9351fa2 100644 --- a/retrofit/src/main/java/retrofit2/RequestFactory.java +++ b/retrofit/src/main/java/retrofit2/RequestFactory.java @@ -803,9 +803,15 @@ private ParameterHandler parseParameterAnnotation( } return new ParameterHandler.Tag<>(tagType); + } else if (shouldIgnoreParameter(annotation)) { + return new ParameterHandler.NoOp<>(); } - return null; // Not a Retrofit annotation. + return null; // No ParameterHandler for annotation. + } + + private boolean shouldIgnoreParameter(Annotation annotation){ + return annotation.getClass().isAnnotationPresent(IgnoreParameter.class); } private void validateResolvableType(int p, Type type) {