2016-12-20 2 views
0

Я новичок в игре. В данном коде, вызывающем/connect, подключается к salesforce и перенаправляется в/getObjects, но после перенаправления salesforce переменная подключения «x» снова получает значение null.Переменные сбрасываются после перенаправления [SCALA-PLAY]

package controllers 

import play.api.mvc.{Action, Controller} 

class ApplicationController extends Controller { 
    var x:connectBase = null 
    def connect(uname: String, pwd: String) = Action { 
    val con = SalesForceDump(uname, pwd) 
    con.connect 
    if (!con.isConnected) { 
     Ok("error") 
    } 
    else { 
     x = connectBase(con) 
     Ok("user:").withSession("connected" -> uname) 
     Redirect(routes.ApplicationController.getObjects) 
     // Ok("done") 
    } 
    } 

    def getObjects = Action { request => 
    println(x.connection) // this gets null 
    request.session.get("connected").map { user => 
     println("Hello " + user) 
     Ok(x.connection.getAllObjects.mkString(",")) 
    }.getOrElse { 
     Unauthorized("Oops, you are not connected") 
    } 
    } 
} 

ответ

1

Я предполагаю, что вы используете введенный маршрутизатор (стандартная конфигурация приложения Play).

Новый экземпляр контроллера создается для каждого запроса, поэтому он «ожидает», что вы теряете содержимое своей переменной.

Чтобы сохранить его между запросами, вы должны объявить контроллер в качестве одноэлементных, используя эту аннотацию:

@javax.inject.Singleton 
class ApplicationController extends Controller { 
    ... 
} 

Однако, вы, возможно, отсутствует какой-то момент. Эта переменная будет совместно использоваться всеми пользователями (подключенными или нет), которые имеют доступ к вашему приложению. Более того, если у вас несколько экземпляров вашего приложения, вы не будете иметь эту переменную, реплицируемую по всем экземплярам ваших приложений. Из-за этого у вас могут возникнуть проблемы.

Воспроизведение приложений, как правило, должно быть без гражданства, это означает, что они не хранят переменную, которую они повторно используют в разных запросах. Если вам необходимо хранить вещи, вы можете рассмотреть:

  • используя базу данных;
  • с использованием файла cookie для «малых» данных, специфичных для пользователя.