2015-07-21 39 views
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"; 
     } 
    } 
+0

你在做什麼'靜態易失性用戶! - 擺脫班級變數 – 6ton

+0

@ 6ton這很好。我需要它來存儲一個檢索值,而不是使用model.addAttribute(「user」,user)在攜帶用戶的所有方法中播放hot-potato。 – Kingamere

+0

那麼** 2 **用戶在同一時間嘗試執行相同操作時會發生什麼?看起來你的高度非正統設計是問題,而不是Spring MVC「毫無理由地」做事。 – kryger

回答

0

我想通了什麼,我不得不這樣做。我基本上在「用戶」一個會話對象:@SessionAttributes(「用戶」)