2017-08-08 101 views
0

我想通過調用一個類級別的註解與@RequestMapping(簽到)的方法(從方法:認證),如下所示:調用由一流水平與@RequestMapping註解的方法,包括一個自動裝配Autowired類

@RequestMapping(value = /authenticate, method = RequestMethod.POST) 
public @ResponseBody Response authentication(HttpServletRequest request) 
{ 
    UserController user = new UserController();  
    return user.signIn(request, null); 
} 

和我的控制器看起來像:

@Component 
    public class UserManager { 
     public User auth(User user, String lang) { 
     .... 
     return user; 
     } 
    } 

@Autowired 
private UserManager userManager; 

@RequestMapping(value = /signin, method = RequestMethod.POST) 
public @ResponseBody Response signIn(HttpServletRequest request) {  
     JsonObject json = Misc.parseJson(request); 
     String lang = Misc.getLang(request); 
     user.setEmail(Misc.getEmail(json)); 
     user.setPassword(Misc.getEncryptedPassword(json)); 

     return ResponseUtils.success(userManager.auth(user, lang)); 

} 

用戶管理與@Component註解

問題是當我調用方法「signIn」,並通過「/ authenticate」映射新建一個UserController實例時,UserManager變爲NULL。所以現在我假設自動裝配在這樣完成時不起作用。

有沒有其他方法可以調用signIn方法?我不希望將一個已經存在的代碼複製到另一個類中,只是爲了得到這個工作...

+0

你爲什麼要在另一個控制器類中實例化一個控制器類?顯示你的UserManager代碼,它是否是彈簧管理的?對於身份驗證和授權,我會建議使用Spring-Security,而不是創建自己的。 –

+0

我們需要驗證一些操作,例如刪除或更新我們網站中的某些數據,即使用戶已經登錄。所以我認爲,不是創建另一個身份驗證檢查,我可以使用用於登錄的方法用戶進入網站,因爲它基本上是一樣的。我想我不能使用相同的映射,或者有沒有辦法爲單個方法創建兩個映射值? – Juni

+0

如果它是一個服務層方法,你可以在控制器中用不同的映射值或URL創建任意數量的方法。你的驗證碼是未知的,你試圖達到的似乎並不正常,請先閱讀spring文檔。 –

回答

0

所以最後我只是把邏輯分開了。儘管我嘗試過的一個解決方案是我只能添加另一個映射到signIn方法,而不是在另一個類中添加新方法,因爲邏輯相似。仍然我選擇了一個單獨的邏輯,因爲我的目的是在signIn方法中有很多不必要的代碼。

1

Autowiering只能在春天管理的bean中工作。如果您使用new關鍵字創建一個類,它不是彈簧管理bean,並且autowiering不起作用。

您可以嘗試自動裝載包含已註釋方法的類,或者更好地將代碼放入可由兩種方法使用的服務類中。

0

@Autowired沒有問題。首先有兩種註釋 方法基註釋和字段級註釋。您只是使用了字段級別的註釋。請使用「org.springframework.beans.factory.annotation.Autowired」檢查您的導入類,或者它可以是啓動「UserManager」的問題

0

我不知道您爲什麼不移動邏輯成單獨的服務類裏面,但嘗試:

UserController.java

public UserController(UserManager userManager) { 
    this.userManager = userManager; 
} 

,然後內部控制器,其中認證資源的方法位於:

@Autowired UserManager userManager; 

@RequestMapping(value = /authenticate, method = RequestMethod.POST) 
public @ResponseBody Response authentication(HttpServletRequest request) { 
    UserController user = new UserController(userManager); 
    return user.signIn(request); 
} 
相關問題