2014-12-04 57 views
2

據我所知,我可以使用@Autowired在類中注入一個bean。注入特定的bean作爲函數參數與多個參數

現在我很好奇:: 我不想有@Autowired的私人屬性。 我在我的控制器中有一個函數,我想直接在函數中注入bean作爲參數。 我得到一個錯誤,說該文件和令牌不是豆。

是否有自動裝配或注入我需要的bean作爲參數的方法?

@Controller 
public class SpinalToolboxWebController { 

    /*@Autowired 
    private FileOperationsService fileOperationsService; 


    @Autowired 
    private Comparator<String> comparator; 

    @Autowired 
    private ServerResponse serverResponse; 

    @Autowired 
    private SoftwareCommunicationService softwareCommunicationService; 

    @Autowired 
    private StringBuffer stringBuffer; 

    @Autowired 
    private UserEnvironmentService userEnvironmentService;*/ 


    @Autowired 
    @RequestMapping(value="/upload", method = RequestMethod.POST, produces="application/json") 
    public @ResponseBody 
    ServerResponse handleUploadedFiles(@RequestParam(value = "file") MultipartFile file, 
             @RequestParam(value="token") String token, 
             SoftwareCommunicationService softwareCommunicationService, 
             FileOperationsService fileOperationsService, 
             ServerResponse serverResponse)throws IOException { 

     System.out.println("Passing throught upload controller"); 

     if(!fileOperationsService.isUploadedFileExtensionAllowed(file.getOriginalFilename())) 
     { 
      serverResponse.setUndefinedResponse(); 
      return serverResponse; 
     } 

     if(fileOperationsService.uploadFile(file, token)){ 
      serverResponse.setResponse(file, softwareCommunicationService.generateRawAndHeader(file)); 
     } 
     else{ 
      serverResponse.setUndefinedResponse(); 
     } 
     return serverResponse; 
    } 

} 
+0

爲什麼你不想要字段? – 2014-12-04 23:07:51

回答

2

作爲內置功能,沒有。你不能做你的建議。

但是,Spring提供了自己編寫此功能的工具。你需要想出一個標記註釋類型。類似@MethodBean。您可以註釋您想從ApplicationContext注入的處理程序方法參數。然後,您需要編寫一個擴展爲HandlerMethodArgumentResolver的類並查找此註釋。您必須添加一個@AutowiredWebApplicationContext字段,從中獲取bean並將其提供給該方法。

然後您將註冊該bean作爲我們MVC堆棧的HandlerMethodArgumentResolver的一部分。

春決定了它具有調用處理方法在你的榜樣,現在看起來是這樣的

@RequestMapping(value="/upload", method = RequestMethod.POST, produces="application/json") 
public @ResponseBody 
ServerResponse handleUploadedFiles(@RequestParam(value = "file") MultipartFile file, 
            @RequestParam(value="token") String token, 
            @MethodBean SoftwareCommunicationService softwareCommunicationService, 
            @MethodBean FileOperationsService fileOperationsService, 
            @MethodBean ServerResponse serverResponse)throws IOException { 

它將使用適當的HandlerMethodArgumentResolver來解決每個參數的參數。

對於@MethodBean帶註釋的參數,它會找到您的自定義實現,在注入的WebApplicationContext中查找參數類型的bean,並將其作爲參數提供。

+0

感謝您的好解釋。我之所以想到這一點,是因爲我的控制器是單身人士,如果我使用「Autowired private ServerResponse serverResponse」爲例,然後在方法中使用serverResponse,用戶是否有訪問另一個人的數據的風​​險? – bigjel 2014-12-05 01:25:21

+0

@bigjel這取決於「ServerResponse」是什麼。你的意思是'ServletResponse'嗎?如果是的話,那就沒有問題了。 Spring會做一些智能的處理,這樣你的控制器只能看到它當前正在處理的ServletResponse。 – 2014-12-05 01:33:48

+0

不,這是我爲服務器響應創建的類。它包含私有字符串字段...和get/set方法。 – bigjel 2014-12-05 01:42:10