2017-11-23 4 views
0

SDRのベースパス を「/ api」に設定した@RepositoryRestControllerを使用して、@RepositoryRestResourceの自動生成コントローラメソッドをオーバーライドしたいと考えています。春データRest @RepositoryRestControllerと@RequestMapping

スプリングデータレスト3.0(およびそれ以前)は言う:

「[スニペットに示すように、このコントローラは、他のすべてのRESTfulなエンドポイントによって使用さRepositoryRestConfiguration.setBasePathで定義された同一のAPIのベースパスから提供され(例えば、/ api) " https://docs.spring.io/spring-data/rest/docs/3.0.1.RELEASE/reference/html/#customizing-sdr.overriding-sdr-response-handlers(第15.4章)

このコードスニペットでは、クラスレベルに@RequestMappingはありません。

マイSDRアプリがRepositoryRestConfigurationオブジェクト

config.setBasePath("/api"); 

で構成されており、まだ@RepositoryRestControllerはSDRの自動生成、コントローラのメソッドをオーバーライドしません。

この投稿への受け入れanswearを検討してください: Spring Data Rest controllers: behaviour and usage of @BasePathAwareController, @RepositoryRestController, @Controller and @RestController

を、私はこのことを理解して助けてください! :)

AppConf.java:

@Configuration 
@Import(value = {DataConf.class}) 
@EnableWebMvc 
@ComponentScan(value = "pl.mydomain.controller") 
public class AppConf 
{ 
    @Bean 
    public RepositoryRestConfigurer repositoryRestConfigurer() { 
     return new RepositoryRestConfigurerAdapter() { 
      public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { 
       config.setBasePath("/api"); 
      } 
     }; 
    } 
} 

TokenController.java:

@RepositoryRestController 
public class TokenController 
{ 
    private TokenRepository repository; 

    @Autowired 
    public TokenController(TokenRepository tokenRepository) { 
     this.repository = tokenRepository; 
    } 

    @RequestMapping(method = GET, path = "/tokens") 
    public @ResponseBody ResponseEntity<?> tokens() 
    {  
     return ResponseEntity.ok("Hello"); 
    } 
} 

TokenRepository.java:

@RepositoryRestResource(path = "tokens") 
public interface TokenRepository extends CrudRepository<Token, Long>{ 
} 
+0

あなたは何を達成したいのですが、何が問題になっていますか? –

+0

自動生成されたコントローラメソッドのオーバーライドについては、こちら[https:// stackoverflow]を参照してください。com/questions/36773171/spring-data-rest-override-repository-method-on-the-controller/36790697#36790697)を参照してください。 –

+0

@ marc-tarin、はい、あなたが指摘したトピックは大丈夫ですが、SDRの基本パスを設定するとどうなりますか?物事が変わる...私のコントローラはオートジェントをオーバーライドしません。メソッド。 –

答えて

0

上記のジレンマを解決するための鍵は、プロジェクトを構成しました。正しい方法でつまり、AbstractAnnotationConfigDispatcherServletInitializer::getServletConfigClasses()メソッド(getRootConfigClasses()に渡されたAppConf.javaではなく)に渡されたクラスに@ComponentScanを入れることです。

DispatcherConf.java:

public class DispatcherConf extends AbstractAnnotationConfigDispatcherServletInitializer { 
    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[] {AppConf.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[] {WebConf.class}; // !!! 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] {"/*"}; 
    } 
} 

AppConf.java:

@Configuration 
@Import({DataConf.class}) 
public class ApplicationConf 
{ 
    @Bean 
    public RepositoryRestConfigurer repositoryRestConfigurer() { 
     return new RepositoryRestConfigurerAdapter() { 
      @Override 
      public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { 
       config.setBasePath("/api"); // !!! 
      } 
     }; 
    } 
} 

DataConf.java:

@Configuration 
@EnableJpaRepositories(basePackages = { 
     "pl.example.data.repository" 
}) 
@EnableTransactionManagement 
public class DataConf 
{ ... } 

WebConf.java:

@Import(RepositoryRestMvcConfiguration.class) 
@ComponentScan({"pl.example.api.controller"}) // !!! 
public class WebConf { 
} 

私が謎を解決したとしても、なぜそれが問題なのか分かりません。むしろそのhttps://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/ComponentScan.html状態:

注釈タイプComponentScan onfiguresコンポーネントスキャニングディレクティブ@Configurationクラスで使用するための 。