Spring Bootでスケジュールされたタスクを作成したいとします。私はすでにこのような定義を持っています。既存のコントローラを使用したSpringブートのスケジュール済みタスク
@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);
private static long count = 0;
@Autowired
private TaskRepository taskRepository;
@Scheduled(fixedRate = 15000)
public void createTasks() {
count++;
Task t = new Task();
t.setTitle("Scheduled Task " + count);
//TaskController tc = new TaskController();
//tc.create(t);
taskRepository.saveAndFlush(t);
log.info("A new scheduled task has been created!");
}
}
これはうまくいきますが、私のリポジトリのインターフェイスを直接使用しています。リポジトリを直接使用するのではなく、私が持っている既存のコントローラクラスを使いたいと思います。私はこのようになりますコントローラクラスがあります。だから、
@RestController
@RequestMapping("api/v1/")
public class TaskController {
@Autowired
private TaskRepository taskRepository;
@RequestMapping(value = "tasks", method = RequestMethod.POST)
public Task create(@RequestBody Task task) {
return taskRepository.saveAndFlush(task);
}
}
を、どのように私は実際にScheduledTasks
クラスでタスク作成のためのメソッドを作成し、これを呼び出すことができますか?私がコメントアウトしたようにnew TaskController()
のようなことをしようとすると、null参照エラーが発生します。どのようにこれを回避するためのアイデア?
これは技術的には機能しますが、この種の機能を 'Controller'クラスに入れるのは非常に間違っているようです。コントローラの唯一の関心事は、UIにある必要があります。 –
一般的な機能をサービスクラスに抽出し、コントローラとタスクの両方でこのサービスを使用する方が効果的です。 ✅ – Strelok
私はそれが良いデザインではないことに懸念があることに同意する必要があります。サービスのステレオタイプを使用してそのログインを抽象化し、ScheduledTaskとControllerの両方にサービス(autowired)。 – Oliver