2016-05-30 25 views
1

インタフェース上でSpring MVCアノテーションの処理を停止する必要がありますが、このインタフェースのBeanを作成する必要があります。例: 私はMVC RESTアノテーションとApiインタフェースを共有しています。コントローラはこのApiを実装しています。他のプロジェクトでは、インタフェースに基づいて(注釈を処理することによって)RESTクライアントを作成します。しかし、クライアントを作成すると、Springはインターフェイスを戻り値の型として見て、内部で注釈を処理します。ですから、RESTクライアントを作成するときに注釈の処理を停止する必要がありますが、コントローラ注釈が機能するはずです(今は正常に動作します)。Spring MVCアノテーション処理を停止する

@RequestMapping("/resource1") 
public interface Api { 
    @RequestMapping(method = RequestMethod.POST) 
    Resource1 getResource1(); 
} 

@RestController 
public class Controller implements Api { 
    @Override 
    public Resource1 getResource1() { 
     return null; 
    } 
} 

@Configuration 
public class Config { 
    @Bean 
    public Api api() { 
     return RestClientFactory.createRestClientBasedOnAnnotations(Api.class); 
    } 
} 

答えて

0

私はAPIインターフェースとorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappingのオーバーライドboolean isHandler(Class<?> beanType)方法をマークするために使用された新しい注釈を作成することによって、それを解決しました。このメソッドは、最初にクラス(またはクラスが実装するインターフェイス)にControllerまたはRequestMapping注釈が付いているかどうかをチェックします。私はBackEndApiInterface注釈を検索する追加のチェックを追加し、それが見つかった場合はfalseを返します。

@Retention(RetentionPolicy.RUNTIME) 
public @interface BackEndApiInterface { 
} 

@BackEndApiInterface 
@RequestMapping("/resource1") 
public interface Api { 
    @RequestMapping(method = RequestMethod.POST) 
    Resource1 getResource1(); 
} 

@RestController 
public class Controller implements Api { 
    @Override 
    public Resource1 getResource1() { 
     return null; 
    } 
} 

@Configuration 
public class Config { 
    @Bean 
    public Api api() { 
     return RestClientFactory.createRestClientBasedOnAnnotations(Api.class); 
    } 

    @Bean 
    public static RequestMappingHandlerMapping requestMappingHandlerMapping() { 
     return new RequestMappingHandlerMapping() { 
      @Override 
      protected boolean isHandler(Class<?> beanType) { 
       if (AnnotationUtils.findAnnotation(beanType, BackEndApiInterface.class) != null) { 
        return false; 
       } 
       return super.isHandler(beanType); 
      } 
     }; 
    } 
} 
0

注釈を実装に移して、インターフェイスを純粋なJavaのままにすることができます。

+0

インターフェイスは共有され、注釈に基づいてRESTクライアントを作成/生成するために使用されます。基本的には、REST URL、メソッド、パラメータをサーバーとクライアントのアプリケーションで同期させます。 – Andrew

関連する問題