2017-01-17 33 views
0

必要な共通のREST操作を実行する抽象クラスを作成しようとしていますが、実行しようとしているものが可能であればうまくできません。私はいくつかのアプローチを試してきましたが、そのコードを自分の頭の中でどのように動作させるべきかをすぐに取り除きました。抽象クラスのSpring Autowiredリポジトリ

以下の提案に従って、クラスが更新されました。問題は、CustomerRepositoryがJpaRepositoryに割り当てられないため、そのインタフェースを拡張するものの、具象クラスのコンストラクタが有効でないことです。

AbstractRestController

public abstract class AbstractRestController<T> { 

    private final JpaRepository<T, Serializable> repository; 

    public AbstractRestController(JpaRepository<T, Serializable> repository) { 
    this.repository = repository; 
    } 

    @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
    public ResponseEntity<JsonResponseBody<T>> getOne(@PathVariable Long id) { 
    T restObj = repository.findOne(id); 
    JsonResponseBody<T> response = new JsonResponseBody<>(ResponseStatus.SUCCESS, restObj); 
    return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(response); 
    } 

    protected JpaRepository<T, Serializable> getRepository() { 
    return repository; 
    } 
} 

CustomerController

@RestController 
@RequestMapping(value = "/api/v1/customer") 
public class CustomerController extends AbstractRestController<Customer> { 

    @Autowired 
    public CustomerController(CustomerRepository repository){ 
     super(repository); 
    } 
} 

CustomerRepository

public interface CustomerRepository extends JpaRepository<Customer, Long> { 

} 
+0

抽象クラスをインスタンス化することはできません。したがって、AbstractRestControllerは「コンポーネント」にできません。 –

+0

良い点は、他のものを試して私に残っていた、それはもはや実装にはありません。私は、CustomerRepositoryがJpaRepository をTに設定してCustomerに設定していても、型が同じではないため、抽象クラスのリポジトリをCustomerRepositoryに設定できないと思います。私はジェネリックスとの誤解を浮き彫りにしていると思います。 – Drew

答えて

5

インディアナeed、@ dino-twのように、定義されていない依存関係を持つ抽象クラスをインスタンス化しようとしています。抽象コントローラクラスを絶対に持ち、すべてのサブクラスによって継承される要求処理メソッドを定義することもできます。

public abstract class AbstractRestController<T, ID extends Serializable> { 

    private final JpaRepository<T, ID> repository; 

    public AbstractRestController(JpaRepository<T, ID> repository){ 
     this.repository = repository; 
    } 

    @RequestMapping(value = "/{id}", method = RequestMethod.GET) 
    public ResponseEntity<JsonResponseBody<T>> getOne(@PathVariable ID id) { 
     T restObj = repository.findOne(id); 
     JsonResponseBody<T> response = new JsonResponseBody<>(ResponseStatus.SUCCESS, restObj);  
     return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON_UTF8).body(response); 
    } 

    protected JpaRepository<T, ID> getRepository(){ return repository; } 
} 


@RestController 
@RequestMapping(value = "/api/v1/customer") 
public class CustomerController extends AbstractRestController<Customer, Long> { 

    @Autowired 
    public CustomerController(CustomerRepository repository){ 
     super(repository); 
    } 

} 
+0

あなたの提案をお寄せいただき、ありがとうございました。これはうまくいくはずですが、CustomerRepositoryの入力に間違いがあります。 "コンストラクタAbstractRestController (CustomerRepository)が定義されていない"ため、JpaRepository に割り当て可能なCustomerRepositoryが表示されない – Drew

+0

更新されたコードを質問に追加しますか?問題が何であるかを推測するよりも簡単に見てみることができます。 – woemler

+0

ありがとう、私は、あなたの提案だった更新されたクラスで質問を更新しました。 ** CustomerRepository **は** JpaRepository ** – Drew