Java 当值保存在Play controller中时,如何读取服务层中的会话值

Java 当值保存在Play controller中时,如何读取服务层中的会话值,java,playframework,playframework-2.0,Java,Playframework,Playframework 2.0,我正在使用Play 2.4。我有一个扩展play.mvc.controller的控制器。我正在会话中设置用户对象,如下所示: session("username", user); 现在我想在我的服务类中读取这个会话对象,它不扩展play.mvc.Controller,我不知道如何读取它,所以请帮助。可以使用Http.Context类: import play.mvc.Http; class Service { public void something() { St

我正在使用Play 2.4。我有一个扩展
play.mvc.controller
的控制器。我正在会话中设置用户对象,如下所示:

session("username", user);

现在我想在我的服务类中读取这个会话对象,它不扩展
play.mvc.Controller
,我不知道如何读取它,所以请帮助。

可以使用
Http.Context
类:

import play.mvc.Http;

class Service {

    public void something() {
        String username = Http.Context.current().session().get("username");

        // do something
    }
}
但是,你应该吗?一个在下面的层(服务)了解上面的层(控制器)是非常不寻常的。以上代码每个实例都很难测试。为什么不重写它,使您的服务从上面的层接收到它所需要的东西呢

class Service {

    public void something(String username) {
        // do something
    }
}
您的控制器将执行以下操作:

class MyController extends Controller {

    public Result action() {
        String username = session("username");
        service.something(username);
    }
}

可以使用
Http.Context
类:

import play.mvc.Http;

class Service {

    public void something() {
        String username = Http.Context.current().session().get("username");

        // do something
    }
}
但是,你应该吗?一个在下面的层(服务)了解上面的层(控制器)是非常不寻常的。以上代码每个实例都很难测试。为什么不重写它,使您的服务从上面的层接收到它所需要的东西呢

class Service {

    public void something(String username) {
        // do something
    }
}
您的控制器将执行以下操作:

class MyController extends Controller {

    public Result action() {
        String username = session("username");
        service.something(username);
    }
}

第二种解决方案也更容易单独测试。第二种解决方案也更容易单独测试。