Spring 4 には、ジェネリック型解決の主要な拡張機能が含まれていましたが、型引数が含まれている Bean クラスでパラメーター化されている場合、ジェネリック型の自動配線に問題があります。
外部サービスに送信されたジョブのステータスを追跡する必要があり、開始時に各ジョブのエントリを作成し、ポストバックを受信したときにそれをクリアまたは更新したいと考えています。私は通常、永続化戦略をサービス インターフェイスから分離するように努めているため、インターフェイスJobStatus
と Spring Data Mongo クラスを用意していますMongoJobStatus implements JobStatus
。外部サービスが ID (HTTP 502 など) を割り当てる機会を得る前にジョブが失敗する可能性があるJobStatus
ため、更新を識別するためにサービスに戻す必要があります。
interface JobStatusService<S extends JobStatus> {
S beginJob(...);
S updateJobStatus(S targetJob, Status newStatus);
void finishJob(S targetJob);
}
したがって、ジョブの起動とポストバックの記録を処理する Spring コントローラーは次のようになります。コントローラー クラスは型パラメーターを持っているため、新しいステータス オブジェクトを格納してサービスに戻すことができます。
@Controller
public class JobController<JS extends JobStatus> {
@Autowired JobStatusService<JS> jobService;
... handler method ...
JS status = jobService.createJob(info, goes, here);
// submit job via HTTP
jobService.updateJobStatus(status, Status.PROCESSING);
...
}
私の MongoDB を利用した実装は次のようになります。
public class MongoJobStatusService implements JobStatusService<MongoJobStatus> {
MongoJobStatus beginJob(...) {...}
MongoJobStatus updateJobStatus(MongoJobStatus job, Status newStatus) {...}
}
起動しようとすると、Spring コンテキストがNoSuchBeanDefinitionException
forで失敗しJobStatusService
ます。を設定required=false
すると、MongoJobStatusService
Bean が適切にコンポーネント スキャンされ、コンテキストにインストールされることを確認しましたが、Spring は、そのクラスがそのパラメータ化されたジェネリック インターフェイスを実装していることを理解できないようです。
フィールドレベルでリテラル型引数として埋め込まれているのではなく、含まれている Bean レベルでパラメーター化された型引数を持つジェネリックインターフェイスを実装する Bean が必要であることを Spring に指定する方法はありますか?