web-dev-qa-db-ja.com

Spring 3.0でセッション属性を設定および取得する

セッションスコープからドメインオブジェクト(UserVO)を読み取りたい。

WelcomeControllerというコントローラにUserVOを設定しています

@Controller
@RequestMapping("/welcome.htm")
public class WelcomeController {
@RequestMapping(method = RequestMethod.POST)
    public String processSubmit(BindingResult result, SessionStatus status,HttpSession session){
      User user = loginService.loginUser(loginCredentials);
     session.setAttribute("user", user);
         return "loginSuccess";
    }
}

オブジェクトをjspページで使用できます<h1>${user.userDetails.firstName}</h1>

しかし、私は別のコントローラーから値を読み取ることができません。

次のようにセッション属性を読み取ろうとしています:

@Controller
public class InspectionTypeController {
@RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST )
 public String addInspectionType(InspectionType inspectionType, HttpSession session)
 {
           User user = (User) session.getAttribute("user");
           System.out.println("User: "+ user.getUserDetails().getFirstName);

        }
} 
14
binary

表示したコードは機能するはずです動作します-HttpSessionはコントローラー間で共有されており、同じ属性名を使用しています。したがって、あなたが私たちに見せていない他の何かがうまくいっていません。

ただし、機能するかどうかに関係なく、Springは@SessionAttributeアノテーションを使用して、セッションでモデルオブジェクトを維持するためのより洗練されたアプローチを提供します( docs を参照)。

たとえば(私はこれをテストしていませんが、それはあなたにアイデアを与えます):

@Controller
@RequestMapping("/welcome.htm")
@SessionAttributes({"user"})
public class WelcomeController {
    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(ModelMap modelMap){
       User user = loginService.loginUser(loginCredentials);
       modelMap.addtAttribute(user);
       return "loginSuccess";
    }
}

その後

@Controller
@SessionAttributes({"user"})
public class InspectionTypeController {

   @RequestMapping(value="/addInspectionType.htm", method = RequestMethod.POST )
   public void addInspectionType(InspectionType inspectionType, @ModelAttribute User user) {
      System.out.println("User: "+ user.getUserDetails().getFirstName);
   }
} 

ただし、元のコードが機能していない場合は、セッションに何か問題があるため、これも機能しません。

40
skaffman

@SessionAttributesは特定のハンドラーのコンテキストでのみ機能するため、WelcomeControllerで設定された属性はこのコントローラーでのみ表示されます。

6
karpaczio

親クラスを使用してすべてのコントローラーを継承し、そこにSessionAttributesを使用します。このクラスは、mvcのパッケージスキャンに含まれている必要があります。

2

UserVOをSerializableに設定していない可能性があります。

0
Anil Bhargava