2014-04-09 70 views
2

有沒有辦法將scala中的會話對象轉換爲java中的會話對象Play在Play框架中將Scala會話對象轉換爲Java會話對象

我已經寫在java一個Model method,如:

public void DoSomething(Request request, Session session) 
{ 
     String fancyValue = request.getQueryString("userInput"); 
     session.put("Some Fancy Stuff",fancyValue); 
} 

並寫入scala一個Controller方法,如:

def showHomePage = Action { implicit request => 

    val JRequest = play.core.j.JavaHelpers.createJavaRequest(request) 
    val JSession // conversion needed from request.session to play.mvc.Http.Session 

    new SomeModel().DoSomething(JRequest,JSession) 

    // would this include the updates done to the session in the java model? 
    Ok("Testing Stuff").withSession(session) 
} 
+0

如果要在客戶端持久保留會話,不應該是'Ok(「Testing Stuff」)。withSession(/ * updated session * /)'' (在會話cookie中保存太多數據可能不是一個好主意,而是使用服務器端緩存的句柄)。 –

+0

@RichardClose我正在專注於其他事情,忘記了這一點,將編輯幷包含該細節,並且我正在使用會話來存儲一個簡單的ID,因此沒有機會將東西塞進它,謝謝:) – somedev

回答

2

如果look at the docs of the JavaHelpers package,你會發現一個功能createJavaContext那裏。您可以使用它來獲得play.mvc.Http.Context,您可以從中提取play.mvc.Http.Requestplay.mvc.Http.Session

val java_ctx = play.core.j.JavaHelpers.createJavaContext(request) 
val java_request = java_ctx.request() 
val java_session = java_ctx.session() 
+0

將更新到如果我在控制器中返回Ok(「some string」)。withSession(session),模型中的java_session會保留。 – somedev

+0

由於Java會話是一個Java HashMap,我不確定轉換,但'withSession'方法需要一個Scala Map-like的東西作爲參數(也就是'(String,String)'元組的序列。但是,除了這種轉換之外,是的,他們會這樣做,但是正如@RichardClose在他的評論中已經提到的那樣,你應該儘量避免把太多的東西放在那裏,最好的做法是在會話cookie中只有一些令牌(會話ID)其餘的在服務器端 – Carsten

+0

我目前只使用會話來存儲一個Id,我知道這個遊戲使用cookie來存儲客戶端的會話,並且僅限於4KB 我只需要知道如何轉換和如果在java中更新會話將保留scala控制器中的更新。感謝:) – somedev