我正在尝试测试控制器,它正在使用新的Action.async
.下面的文档我已经排除了控制器下的部分我想测试用类型引用来分隔特征:
trait UserController { this: Controller =>
def index() = Action { /* snip */ }
def register() = Action.async(parse.json) { request => /* snip */ }
}
Run Code Online (Sandbox Code Playgroud)
文档说明我应该将其测试为:
object UsersControllerSpec extends PlaySpecification with Results {
class TestController() extends Controller with UserController
"index action" should {
"should be valid" in {
val controller = new TestController()
val result: Future[SimpleResult] = controller.index().apply(FakeRequest())
/* assertions */
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于index()
方法它完美地工作,不幸的是我无法做同样的事情register()
,因为在它上面应用FakeRequest返回的实例Iteratee[Array[Byte], SimpleResult]
.我注意到它有 …
我想根据运行的环境将我的播放应用程序指向特定的应用程序配置文件.有三个,它们对应于标准播放状态:
一个同事共享了一个执行此操作的方法,该方法需要设置OS环境变量.
我想消除设置OS变量的需要.我的偏好是使用Play在启动时使用的任何内容来了解它所处的模式.
例如,如果play run
从命令行执行,则输出的一部分是"[info] play - Application started (Dev)"
我想在我的Global.java中使用这些信息,我在其中覆盖onLoadConfig,如下所示:
public Configuration onLoadConfig(Configuration baseConfiguration, File f, ClassLoader loader) {
String playEnv=<some static method to get mode>;
Config additionalConfig = ConfigFactory.parseFile(new File(f,"conf/application."+playEnv+".conf"));
Config baseConfig = baseConfiguration.getWrappedConfiguration().underlying();
return new Configuration(baseConfig.withFallback(additionalConfig));
}
Run Code Online (Sandbox Code Playgroud)
我发现的一切都是在应用程序启动后如何使用isDev(),isTest(),isProd().
当我覆盖Global.java中的onLoadConfig时,是否存在提供模式的静态方法?
有没有办法结合akka 2.3和2.2?现在我在运行这样的应用程序时遇到了AbstractMethodError.我需要在一个应用程序中同时使用它们,因为Akka 2.3带有非常有用的akka持久性模块,它非常可靠(与它的前身相反),这种可靠性在我的情况下非常重要.我已经尝试从源代码编译游戏2.2.2并将akka依赖项更改为2.3但我仍然得到相同的错误:
[ERROR] [04/01/2014 09:42:26.105] [play-akka.actor.default-dispatcher-6] [ActorSystem(play)] Uncaught error from thread [play-akka.actor.default-dispatcher-6] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled
java.lang.AbstractMethodError
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
at akka.actor.ActorCell.invoke(ActorCell.scala:487)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
at akka.dispatch.Mailbox.run(Mailbox.scala:220)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Run Code Online (Sandbox Code Playgroud) 播放框架JAVA:
我试图获取请求控制器功能的URL的名称.例如,我有一条路线
GET /mypage controllers.Mypage.myfunction()
我有另一个请求相同控制器的页面
GET /anotherpage controllers.Mypage.myfunction()
有没有办法在控制器中找到请求是来自/mypage
还是来自/anotherpage
?
谢谢
一旦我在2.3 play项目上运行'sbt compile',我就不能使用'sbt compile'来编译任何Play 2.2.x项目了.这是我运行sbt命令时的错误.
[info] Loading project definition from /Users/macbookpro/playproject/project
[error] java.lang.NoClassDefFoundError: play/Play$
[error] Use 'last' for the full log.
Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore?
Run Code Online (Sandbox Code Playgroud) 我正在尝试保护我的播放应用程序,但我不知道从哪里开始.在游戏教程中,我没有找到关于该主题的任何章节.据我所知,安全主题在播放版本之间发生变化.那么你们用什么来保护你们的应用程序呢?我是Play的新手所以如果我提出明显的问题,请原谅我.
编辑:好的,maby问题不够清楚(我真的很抱歉).在谈论安全性时,我的意思是我需要一些东西来处理用户凭据和工具,这允许我限制对某些页面的访问,并最终在我的应用程序中进行一些休息操作.
编辑2:我现在将尝试deadbolt2,我们将看到它是如何工作的.但我仍然鼓励你们与其他人分享你对Play安全性的了解:)
我不能wss://
在我用Play!Framework 2.2创建的简单WebSocket应用程序中使用.它回复了消息.端点是这样的
def indexWS2 = WebSocket.using[String] {
request => {
println("got connection to indexWS2")
var channel: Option[Concurrent.Channel[String]] = None
val outEnumerator: Enumerator[String] = Concurrent.unicast(c => channel = Some(c))
// Log events to the console
val myIteratee: Iteratee[String, Unit] = Iteratee.foreach[String] {gotString => {
println("received: " + gotString)
// send string back
channel.foreach(_.push("echoing back \"" + gotString + "\""))
}}
(myIteratee, outEnumerator)
}
}
Run Code Online (Sandbox Code Playgroud)
并且路线被描述为
GET /ws2 controllers.Application.indexWS2
Run Code Online (Sandbox Code Playgroud)
我从这样的JS客户端创建连接
myWebSocket = new WebSocket("ws://localhost:9000/ws2");
Run Code Online (Sandbox Code Playgroud)
一切正常.但是,如果我改变ws://
成wss://
以使用TLS,它失败,我得到以下Netty的例外:
[error] …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用其构造函数为测试创建一个Http.Context失败.有人看到我做错了吗?
我看过以下内容,但它仅适用于Play 2.0:
Play framework 2.0:将值存储在Http.Context中
看起来类更改为2.2.1并且它有更多的构造函数参数,如下所示:
这是我的代码:
import java.util.Map;
import java.util.Collections;
import org.junit.*;
import static org.mockito.Mockito.*;
import play.mvc.*;
import play.test.*;
import play.mvc.Http;
import play.mvc.Http.Context;
import play.api.mvc.RequestHeader;
import static play.test.Helpers.*;
import static org.fest.assertions.Assertions.*;
public class TemplateTests {
public static FakeApplication app;
private final Http.Request request = mock(Http.Request.class);
@BeforeClass
public static void startApp() {
app = Helpers.fakeApplication();
Helpers.start(app);
}
@Before
public void setUp() throws Exception {
Map<String, String> flashData = Collections.emptyMap();
Map<String, Object> argData = Collections.emptyMap();
Long id = 2L; …
Run Code Online (Sandbox Code Playgroud) 我已经和它斗争了几个小时,我无法弄清楚为什么在Heroku中部署我的Scala Play 2.2应用程序之后我得到了这个堆栈跟踪:
2013-09-30T01:05:09.413177+00:00 heroku[web.1]: Starting process with command `target/start -Dhttp.port=18174 $PLAY_OPTS`
2013-09-30T01:05:10.931893+00:00 app[web.1]: bash: target/start: No such file or directory
2013-09-30T01:05:12.382399+00:00 heroku[web.1]: Process exited with status 127
2013-09-30T01:05:12.414050+00:00 heroku[web.1]: State changed from starting to crashed
Run Code Online (Sandbox Code Playgroud)
我尝试了几个Procfile版本没有成功,一些例子是:
web: target/start -Dhttp.port=$PORT
web: target/start -Dhttp.port=$PORT $PLAY_OPTS
web: target/start -Dhttp.port=$PORT $JAVA_OPTS
web: target/start Web -Dhttp.port=$PORT $PLAY_OPTS
web: target/start -Dhttp.port=$PORT $PLAY_OPTS -Dconfig.file=application.conf
web: target/start -Dhttp.port=$PORT $PLAY_OPTS -Dconfig.file=conf/application.conf
Run Code Online (Sandbox Code Playgroud)
我甚至尝试过不使用Procfile.
我正在使用Scala 2.10.2和Play 2.2.在同一个Heroku应用程序中,我在Play 2.0上运行了我的项目的先前版本,我不知道这是否相关.
该应用程序在本地完美运行 我连接到Heroku的bash并运行
sbt clean
sbt stage
Run Code Online (Sandbox Code Playgroud)
手工检查,我检查了目标是否被清理并重新建造.
"目标/开始:没有这样的文件或目录"是指什么?对目标?要启动命令?别的什么?
我有一个登录路由,应该将其输入参数作为POST变量传输.我已经定义了这样的路线:
POST /v1/accounts/login controllers.v1.Accounts.login(username: String, password: String)
Run Code Online (Sandbox Code Playgroud)
我的控制器是这样的:
object Accounts extends Controller {
def login(username: String, password: String) = Action {
Ok("Foo " + username)
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用Chromes Advance REST Client测试此路由时,它仅适用于GET参数,而不是我将其作为application/x-www-form-urlencoded
POST表单数据发送.
该播放Framework文档实际上从未提到POST参数,但它也没有说,这是行不通的.
我认为如果我创建一个Form并将我的请求绑定到那个可能会让它工作,但这似乎是不必要的复杂.
是否真的没有办法使用routes文件绑定POST参数?
java ×3
scala ×3
akka ×1
deployment ×1
heroku ×1
sbt ×1
scala-2.10 ×1
security ×1
specs2 ×1
ssl ×1
unit-testing ×1
websocket ×1