2015-04-03 31 views
4

我正在嘗試開發一個小型的Spring MVC應用程序,我想從每個會話的開始初始化User對象。Spring MVC @Scope代理bean&Jackson 2

我有User類

@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class MyUser implements User { 

    // private fields 
    // getters and setters 


    public void fillByName(String username) { 
     userDao.select(username); 
    } 

} 

,我想初始化MYUSER對象一次春季安全識別用戶,在攔截器類(順便說一句,這是一個好的做法呢?)

public class AppInterceptor extends HandlerInterceptorAdapter { 

    @Autowired 
    MyUser user; 

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 

     Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

     if (!(auth instanceof AnonymousAuthenticationToken)) { 
      user.fillByName(auth.getName()); 
     } 

     return true; 
    } 
} 

因此,當Controller處理請求時,已經有初始化會話作用域用戶類。但是,當我試圖序列與傑克遜MYUSER對象,它只是doesnt't工作:

@RequestMapping("/") 
    public String launchApp(ModelMap model) { 

     ObjectMapper mapper = new ObjectMapper(); 

     try { 
      System.out.println(user.getUsername()); // Works good! 
      model.addAttribute("user", mapper.writeValueAsString(user)); // Doesn't work 
     } catch (JsonProcessingException e) { 
      // @todo log an error 
     } 

     return "app/base"; 
    } 

正如你所看到的,MYUSER對象干將工作從Controller類不錯,但傑克遜 - 沒有。

當我從User對象中刪除@Scope註釋時,Jackson序列化開始工作。

顯然,範圍代理豆和單控制器類是問題

但我怎麼能解決這個問題?

-

UPDATE

看起來像我第一誰碰到這個:) 也許這是不好的架構?我應該在控制器中創建一個MyUser類的新實例嗎?常用的做法是什麼?我能想到的

回答

2

一種方法是添加另一個包裝:

@Component 
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class MyScopedUser implements User { 

    private MyUser myUser; 
    // private fields 
    // getters and setters 


    public void fillByName(String username) { 
     userDao.select(username); 
    } 

    public MyUser getMyUser() { 
     return this.myUser; 
    } 
} 

所以,現在你MyScopedUser是範圍代理,但核心用戶是一個普通的類。您可以在稍後將用戶帶出並彙編:

mapper.writeValueAsString(scopeUser.getMyUser())