2015-09-10 7 views
17

バッチ処理のためにカスタム機能を追加したいSpring Data Rest webmvcアプリケーションがあります。カスタムコントローラでのSpringデータのREST URIの受け入れ

私はコントローラを作成してそれをuri名前空間にブレンドしましたが、単純なIDではなくカスタム/searchのようなURIを受け入れることができるようにしたいと思います。

カスタム<String, Long>コンバータを登録しようとしました(私のエンティティはLong IDタイプですが、無視されるようです)

方法のいくつかの並べ替えがあっても、私は同じようにうまく機能エンティティにその意志自動解決URIを呼び出すことができます(私は、単に私のコントローラでStringを受け入れることができるよう)

ここです私はどこにいるのですか。

@Configuration 
public class CustomWebConfiguration extends WebMvcConfigurationSupport { 

    //irrelevant code omitted 

    @Bean 
    public DomainClassConverter<?> domainClassConverter() { 
     DomainClassConverter<FormattingConversionService> dc = new DomainClassConverter<FormattingConversionService>(mvcConversionService()); 
     return dc; 
    } 

    @Override 
    public void addFormatters(FormatterRegistry registry) { 
      registry.addConverter(String.class, Long.class, testConverter()); 
    } 

    @Bean 
    Converter<String, Long> testConverter() { 
     return new Converter<String, Long>() { 

      @Override 
      public Long convert(String source) { 
       //this code does _not_ get run at any point 
       if (source.indexOf('/') == -1) { return Long.parseLong(source); } 

       source = source.substring(source.lastIndexOf('/') + 1); 
       Long id = Long.parseLong(source); 

       return id; 
      } 
     }; 
    } 
} 

SDRコンフィグ

@Configuration 
@EnableHypermediaSupport(type = { HypermediaType.HAL }) 
public class CustomRestConfiguration extends RepositoryRestMvcConfiguration { 

    @Override 
    public RepositoryRestConfiguration config() { 
     RepositoryRestConfiguration config = super.config(); 
     config.setBasePath("/api"); 
     config.exposeIdsFor(ApplicationMembership.class); 
     return config; 
    } 


} 

そして、私の(不自然)コントローラ:

ApplicationTypeが正しく、私は周りを見回してきた

@BasePathAwareController 
@RepositoryRestController 
@RequestMapping("applications/special") 
public class ApplicationExtensionController { 
    @RequestMapping("a") 
    public ResponseEntity<?> reply(@RequestParam("type") ApplicationType type) { 
     return new ResponseEntity<String>(type.getIcon(), HttpStatus.OK); 
    } 
} 

魔法リポジトリSDR /によって管理されている私のエンティティの一つでありますかなりのビットですが、何かを動作させることはできません。私はリポジトリを利用<String, ApplicationType>コンバータを作成すると、それは正しく長いにtypes/1を解析することができないようDomainClassConverterはちょうどその基礎となる<String, Long>コンバータ(明らかに失敗し、呼び出すように、それはまた、呼び出されません。

助けに感謝!

春HATEOAS 0.19.0

  • 春4

    • 春データ休息2.4.0
    • を言及するのを忘れました.2.1

    使用JPAリポジトリ

  • +0

    コントローラに@RepositoryRestControllerを注釈付けしましたか?実際、通常のコントローラのPathVariablesからSDRエンティティを自動取得するのに問題はありませんでしたが、私はSpring Bootを使用しています。これにはいくつかの自動設定が含まれています。 –

    +0

    私はそれを与えるだろう、ありがとうイリーヤ! – CollinD

    +0

    @IlyaNovoseltsev残念ながらサイコロはありません。私はそれを 'GET domain.com/api/applications/batch/removeType?type = types/7'のように照会できるようにしたいと思っていますが、まだエラーを変換できません。 – CollinD

    答えて

    4

    結局のところ、私はコンバータを追加することで正しい軌道に乗っていましたが、間違った設定方法でそれをやっていました。

    私はRepositoryRestMvcConfiguration拡張設定クラスに私のtestConverter()豆を移動してから

    @Override 
    public void configureConversionService(ConfigurableConversionService service) { 
        service.addConverter(testConverter()); 
    } 
    

    を追加し、意図したとおりに働くことによって所望の機能性を得ることができました。最初は間違った場所に投げてしまったのでちょっとばかげているようですが、うまくいけば他の誰かを助けるでしょう!

    +0

    私はこれを動作させることができませんでした。 'mvcConversionService()'とは何ですか? – aycanadal

    +0

    参照:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurationSupport.html#mvcConversionService--「WebMvcConfigurationSupport」を拡張して提供されます。 – CollinD

    4

    は私が私の最後のコメントに基づいて回答を掲載しています。

    はどうやら、必要なロジック - @RequestParamからリポジトリ管理エンティティへのURIを自動変換は、 - (executeQueryMethodprepareUrisを参照)RepositorySearchControllerのいくつかのプライベートメソッドで実装されているので、カスタムコントローラでそれを取得する簡単な方法はありません。

    Spring HATEOASを使用して独自の引数リゾルバを作成できます。 PersistentEntityResourceHandlerMethodArgumentResolverリゾルバがどのように実装されているかを見てください。それは@BackendIdに基づいてエンティティを解決しました。

    +0

    その完全な実例はありませんか?コントローラーはmyEntityパラメーターまたはURIパラメーターを要求する必要がありますか?ありがとう – drenda

    関連する問題