2017-06-28 64 views
0

我想在Spring Boot中創建計劃任務。我已經有這方面的定義,它看起來像這樣:使用現有控制器的Spring Boot中的計劃任務

@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()那樣執行某些操作,則會收到空引用錯誤。任何想法如何解決這個問題?

回答

1

如果你做new TaskController(),你創建的實例不會被Spring管理,因此IoC(自動裝配依賴)不會發生。

我相信你只是想使用控制器的Spring管理實例,在這種情況下,只需將它自動裝入ScheduledTask組件。 (如下所示(未經測試))

@Component 
public class ScheduledTasks { 

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class); 
    private static long count = 0; 

    @Autowired 
    private TaskRepository taskRepository; 

    @Autowired 
    private TaskController tc; 

    @Scheduled(fixedRate = 15000) 
    public void createTasks() { 

     count++; 

     Task t = new Task(); 
     t.setTitle("Scheduled Task " + count); 
     tc.create(t); 
     taskRepository.saveAndFlush(t); 

     log.info("A new scheduled task has been created!"); 
    } 
} 
+3

儘管技術上有效,但在Controller類中放入這種功能似乎是非常錯誤的。控制器唯一需要關注的是用戶界面。 –

+4

更好的是將常用功能提取到服務類中,並在控制器和任務中使用該服務! ✅ – Strelok

+0

我同意這不是一個好的設計,應該有一個關注點分離,並且您可能想要在Service類中使用服務構造型來抽象登錄,並且同時使用ScheduledTask和Controller。該服務(自動佈線)。 – Oliver