@@ -55,28 +55,18 @@ public <T> T newInstance(Target<T> target) {
5555 public <T > T newInstance (Target <T > target , C requestContext ) {
5656 TargetSpecificationVerifier .verify (target );
5757
58- Map <String , MethodHandler > nameToHandler = targetToHandlersByName .apply (target , requestContext );
59- Map <Method , MethodHandler > methodToHandler = new LinkedHashMap <Method , MethodHandler >();
60- List <DefaultMethodHandler > defaultMethodHandlers = new LinkedList <DefaultMethodHandler >();
61-
62- for (Method method : target .type ().getMethods ()) {
63- if (method .getDeclaringClass () == Object .class ) {
64- continue ;
65- } else if (Util .isDefault (method )) {
66- DefaultMethodHandler handler = new DefaultMethodHandler (method );
67- defaultMethodHandlers .add (handler );
68- methodToHandler .put (method , handler );
69- } else {
70- methodToHandler .put (method , nameToHandler .get (Feign .configKey (target .type (), method )));
71- }
72- }
58+ Map <Method , MethodHandler > methodToHandler =
59+ targetToHandlersByName .apply (target , requestContext );
7360 InvocationHandler handler = factory .create (target , methodToHandler );
7461 T proxy = (T ) Proxy .newProxyInstance (target .type ().getClassLoader (),
7562 new Class <?>[] {target .type ()}, handler );
7663
77- for (DefaultMethodHandler defaultMethodHandler : defaultMethodHandlers ) {
78- defaultMethodHandler .bindTo (proxy );
64+ for (MethodHandler methodHandler : methodToHandler .values ()) {
65+ if (methodHandler instanceof DefaultMethodHandler ) {
66+ ((DefaultMethodHandler ) methodHandler ).bindTo (proxy );
67+ }
7968 }
69+
8070 return proxy ;
8171 }
8272
@@ -156,31 +146,53 @@ static final class ParseHandlersByName<C> {
156146 this .decoder = checkNotNull (decoder , "decoder" );
157147 }
158148
159- public Map <String , MethodHandler > apply (Target target , C requestContext ) {
160- List <MethodMetadata > metadata = contract .parseAndValidateMetadata (target .type ());
161- Map <String , MethodHandler > result = new LinkedHashMap <String , MethodHandler >();
162- for (MethodMetadata md : metadata ) {
163- BuildTemplateByResolvingArgs buildTemplate ;
164- if (!md .formParams ().isEmpty () && md .template ().bodyTemplate () == null ) {
165- buildTemplate =
166- new BuildFormEncodedTemplateFromArgs (md , encoder , queryMapEncoder , target );
167- } else if (md .bodyIndex () != null || md .alwaysEncodeBody ()) {
168- buildTemplate = new BuildEncodedTemplateFromArgs (md , encoder , queryMapEncoder , target );
169- } else {
170- buildTemplate = new BuildTemplateByResolvingArgs (md , queryMapEncoder , target );
149+ public Map <Method , MethodHandler > apply (Target target , C requestContext ) {
150+ final Map <Method , MethodHandler > result = new LinkedHashMap <>();
151+
152+ final List <MethodMetadata > metadataList = contract .parseAndValidateMetadata (target .type ());
153+ for (MethodMetadata md : metadataList ) {
154+ final Method method = md .method ();
155+ if (method .getDeclaringClass () == Object .class ) {
156+ continue ;
171157 }
172- if (md .isIgnored ()) {
173- result .put (md .configKey (), args -> {
174- throw new IllegalStateException (md .configKey () + " is not a method handled by feign" );
175- });
176- } else {
177- result .put (md .configKey (),
178- factory .create (target , md , buildTemplate , options , decoder , errorDecoder ,
179- requestContext ));
158+
159+ final MethodHandler handler = createMethodHandler (target , md , requestContext );
160+ result .put (method , handler );
161+ }
162+
163+ for (Method method : target .type ().getMethods ()) {
164+ if (Util .isDefault (method )) {
165+ final MethodHandler handler = new DefaultMethodHandler (method );
166+ result .put (method , handler );
180167 }
181168 }
169+
182170 return result ;
183171 }
172+
173+ private MethodHandler createMethodHandler (final Target <?> target ,
174+ final MethodMetadata md ,
175+ final C requestContext ) {
176+ if (md .isIgnored ()) {
177+ return args -> {
178+ throw new IllegalStateException (md .configKey () + " is not a method handled by feign" );
179+ };
180+ }
181+
182+ BuildTemplateByResolvingArgs buildTemplate = getBuildTemplate (target , md );
183+ return factory .create (
184+ target , md , buildTemplate , options , decoder , errorDecoder , requestContext );
185+ }
186+
187+ private BuildTemplateByResolvingArgs getBuildTemplate (Target target , MethodMetadata md ) {
188+ if (!md .formParams ().isEmpty () && md .template ().bodyTemplate () == null ) {
189+ return new BuildFormEncodedTemplateFromArgs (md , encoder , queryMapEncoder , target );
190+ } else if (md .bodyIndex () != null || md .alwaysEncodeBody ()) {
191+ return new BuildEncodedTemplateFromArgs (md , encoder , queryMapEncoder , target );
192+ } else {
193+ return new BuildTemplateByResolvingArgs (md , queryMapEncoder , target );
194+ }
195+ }
184196 }
185197
186198 private static class BuildTemplateByResolvingArgs implements RequestTemplate .Factory {
0 commit comments