0
由於某些原因,當我對某個URI執行GET請求時,需要在該方法中訪問的變量會丟失其內存或指向null。Spring MVC變量無故重置
我有一個表格,用戶可以更新他的個人信息。但是,當他進入副本,它重定向他一個頁面,讓他知道
我:private static volatile User currentUser;
當用戶登錄和服務器執行GET請求到REST API此字段設置,我編程自己,並返回包含他的信息的用戶。這按預期工作,用戶信息顯示在他的主屏幕上。
代碼上面:
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(@ModelAttribute Credentials credentials,
RedirectAttributes redirect) {
RestTemplate restTemplate = new RestTemplate();
RoleInfo roleInfo = restTemplate.postForObject(
"http://localhost:9090/users/login", credentials,
RoleInfo.class);
if (roleInfo != null) {
if (roleInfo.isAdmin()) {
redirect.addFlashAttribute("credentials", credentials);
return "redirect:/adminHome";
} else {
redirect.addFlashAttribute("credentials", credentials);
return "redirect:/getBasicUser";
}
} else {
return "login_fail";
}
}
@RequestMapping(value = "/getBasicUser", method = RequestMethod.GET)
public <T> String getBasicUser(@ModelAttribute Credentials credentials,
Model model, RedirectAttributes redirect) {
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:9090/users/getBasicUser?username="
+ credentials.getUsername();
ResponseEntity<User> responseEntity = restTemplate.exchange(
url,
HttpMethod.GET,
new HttpEntity<T>(createHeaders(credentials.getUsername(),
credentials.getPassword())), User.class);
User user;
user = responseEntity.getBody();
currentUser = user;
System.out.println("current user: " + currentUser.getUsername());
if (user != null) {
userName = credentials.getUsername();
passWord = credentials.getPassword();
redirect.addFlashAttribute("credentials", credentials);
redirect.addFlashAttribute("user", user);
return "redirect:/basicHome";
} else {
return "register_fail";
}
}
因此,對 「basicHome」 他可以查看自己的信息。同時該網頁上是一個形式的鏈接,在那裏他可以編輯的信息:
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String getEditProfilePage(Model model) {
model.addAttribute("currentUser", currentUser);
System.out.println("current use firstname: " + currentUser.getFirstname());
model.addAttribute("user", new User());
return "edit_profile";
}
如果一個編輯是成功的,他與更新的信息返回到他的主頁。
問題出現在他輸入無效信息時。他應該被重定向回「/ edit」URI並且currentUser
字段仍然應該保存他的信息,但實際上是空的。
這裏是 「/編輯」 PUT功能:
@RequestMapping(value = "/edit", method = RequestMethod.PUT)
public <T> String editProfile(@ModelAttribute("user") User user,
@ModelAttribute("credentials") Credentials credentials,
RedirectAttributes redirect) {
RestTemplate restTemplate = new RestTemplate();
String url = "http://localhost:9090/users/update?username=" + userName;
HttpHeaders headers = createHeaders(userName,
passWord);
@SuppressWarnings({ "unchecked", "rawtypes" })
HttpEntity<T> entity = new HttpEntity(user, headers);
ResponseEntity<User> responseEntity = restTemplate.exchange(url,
HttpMethod.PUT, entity, User.class);
User returnedUser = responseEntity.getBody();
currentUser = returnedUser;
if (returnedUser != null) {
redirect.addFlashAttribute("user", returnedUser);
redirect.addFlashAttribute("credentials", credentials);
return "redirect:/basicHome";
} else {
return "redirect:/editFail";
}
}
你在做什麼'靜態易失性用戶! - 擺脫班級變數 – 6ton
@ 6ton這很好。我需要它來存儲一個檢索值,而不是使用model.addAttribute(「user」,user)在攜帶用戶的所有方法中播放hot-potato。 – Kingamere
那麼** 2 **用戶在同一時間嘗試執行相同操作時會發生什麼?看起來你的高度非正統設計是問題,而不是Spring MVC「毫無理由地」做事。 – kryger