标签: playframework-2.5

播放2.5.3:Cryptic错误消息:在Netty java.lang.NoClassDefFoundError中捕获异常

[error] pcsnPlayRequestHandler - 在Netty java.lang.NoClassDefFoundError中捕获异常:无法初始化类play.api.http.DefaultHttpErrorHandler $ at

我收到错误消息,我的应用程序无法以开发模式启动.

该错误没有给我任何关于出错的细节.我将logback.xml中的日志级别更改为DEBUG,但它没有帮助.

有什么建议如何调查问题?一周前它工作得很好,从那以后,源和配置都没有任何变化.它因为一个未知原因而停止工作.

Edit1:如何启用更详细的日志记录?否则,绝对不清楚错误的来源.

Edit2:更改了标题

 (Server started, use Ctrl+D to stop and go back to the console...)

  Warning: node.js detection failed, sbt will use the Rhino based Trireme JavaScript engine instead to run JavaScript assets compilation, which in some cases may be orders of magnitude slower than using no
  de.js.
  [error] p.c.s.n.PlayRequestHandler - Exception caught in Netty
  java.lang.NoClassDefFoundError: Could not initialize class play.api.http.DefaultHttpErrorHandler$
          at play.core.server.Server$class.logExceptionAndGetResult$1(Server.scala:45)
          at play.core.server.Server$class.getHandlerFor(Server.scala:65)
          at play.core.server.NettyServer.getHandlerFor(NettyServer.scala:47)
          at play.core.server.netty.PlayRequestHandler.handle(PlayRequestHandler.scala:82)
          at play.core.server.netty.PlayRequestHandler.channelRead(PlayRequestHandler.scala:163) …
Run Code Online (Sandbox Code Playgroud)

scala playframework playframework-2.5

19
推荐指数
2
解决办法
5714
查看次数

如何在Scala Play Framework中对服务器启动执行操作?

我的目录中有一个配置文件servers.conf,conf/只要路由/servers被命中,我的ServerController就会读取该配置文件.这不具备性能,因为当文件不会更改时,它需要在每次连续命中时重新读取配置文件.此外,如果配置文件有问题,我可以尽快告诉用户,而不是在页面命中时抛出异常.

目前我在我的这个ServerController.scala:

case class Server(ip: String, port: String)

/**
  * This controller creates an `Action` to handle HTTP requests to the
  * application's server page.
  */
@Singleton
class ServerController @Inject() extends Controller {

  /**
    * Create an Action to render an HTML page with a the list of servers.
    * The configuration in the `routes` file means that this method
    * will be called when the application receives a `GET` request with …
Run Code Online (Sandbox Code Playgroud)

scala startup playframework playframework-2.5

18
推荐指数
1
解决办法
6161
查看次数

在Play Framework 2.5中使用抽象类和对象进行依赖注入

我正在尝试从Play 2.4迁移到2.5,避免弃用.

我有一个abstract class Microservice从中创建了一些对象.Microservice该类的某些函数用于play.api.libs.ws.WS发出HTTP请求以及play.Play.application.configuration读取配置.

以前,我需要的只是一些进口,如:

import play.api.libs.ws._
import play.api.Play.current
import play.api.libs.concurrent.Execution.Implicits.defaultContext
Run Code Online (Sandbox Code Playgroud)

但是现在你应该使用依赖注入来使用WS,也可以使用访问当前的Play应用程序.

我有类似的东西(缩短):

abstract class Microservice(serviceName: String) {
    // ...
    protected lazy val serviceURL: String = play.Play.application.configuration.getString(s"microservice.$serviceName.url")
    // ...and functions using WS.url()...
}
Run Code Online (Sandbox Code Playgroud)

对象看起来像这样(缩短):

object HelloWorldService extends Microservice("helloWorld") {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不明白如何将所有的东西(WS,配置,ExecutionContect)放到抽象类中以使其工作.

我试着把它改成:

abstract class Microservice @Inject() (serviceName: String, ws: WSClient, configuration: play.api.Configuration)(implicit context: scala.concurrent.ExecutionContext) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

但这并没有解决问题,因为现在我也要改变对象,我无法弄清楚如何.

我试图把它object变成一个@Singleton class …

scala playframework playframework-2.5

17
推荐指数
1
解决办法
5795
查看次数

运行Play 2.5.x的警告消息

每当我运行我的应用程序时,activator run我都会收到以下警告:

"The system cannot find the file BIN_DIRECTORY\..\conf\sbtconfig.txt"
Run Code Online (Sandbox Code Playgroud)

这条消息是什么意思?我应该创建这个文件吗?该应用程序工作正常.

playframework playframework-2.5

17
推荐指数
1
解决办法
7546
查看次数

如何测试Scala Play Framework websocket?

如果我有像下面这样的websocket:

def websocket: WebSocket = WebSocket.accept[String, String] { _ =>
  ActorFlow.actorRef(out => LightWebSocketActor.props(out))
}
Run Code Online (Sandbox Code Playgroud)

供参考,这是LightWebSocketActor:

class LightWebSocketActor(out: ActorRef) extends Actor {
  val topic: String = service.topic

  override def receive: Receive = {
    case message: String =>
      play.Logger.debug(s"Message: $message")
      PublishService.publish("true")
      out ! message
  }
}

object LightWebSocketActor {
  var list: ListBuffer[ActorRef] = ListBuffer.empty[ActorRef]
  def props(out: ActorRef): Props = {
    list += out
    Props(new LightSocketActor(out))
  }

  def sendMessage(message: String): Unit = {
    list.foreach(_ ! message)
  }
}
Run Code Online (Sandbox Code Playgroud)

这是使用akkawebsocket方法. …

unit-testing specifications scala playframework playframework-2.5

12
推荐指数
1
解决办法
878
查看次数

播放2.5.3:使用依赖注入来获取配置值

我正在尝试将Playframework应用程序从2.4迁移到2.5.3并且我从application.conf文件中获取值时遇到问题:

之前application.conf我的工作中得到的价值是:

Play.application().configuration().getString("label")
Run Code Online (Sandbox Code Playgroud)

现在,作为Play.application()已过时,我应该使用依赖注入.根据框架文档,我使用以下说明:

  1. 定义导入:导入javax.inject.*; import play.Configuration;
  2. 定义类属性:@Inject private Configuration configuration;
  3. 在我的类上使用配置类属性

当我在控制器上按照这些说明操作时,Application.java它完美地工作:

但是当我尝试在我的项目中的其他类对象上使用它时,依赖注入不起作用,我总是得到一个NullPointerException.

有人可以给我一个关于如何application.conf使用依赖注入获取值的示例吗?

我尝试使用DI的java代码的一部分:

import javax.inject.Inject;
import play.Configuration;
import play.Logger;

public class Zipper {

    @Inject private  Configuration configuration;

    public void unZip(String zipFilePath) {
        Logger.debug("Display : zipFilePath"+zipFilePath);
        Logger.debug("before call parameter from application.conf");
        Logger.debug("configuration.getString = "+configuration.getString("Unzipedfile.path"));
        Logger.debug("aftercall parameter from application.conf");
    }
}
Run Code Online (Sandbox Code Playgroud)

我总是得到一个空指针异常,在行 configuration.getString("Unzipedfile.path")

java dependency-injection playframework playframework-2.5

11
推荐指数
2
解决办法
8987
查看次数

在Play框架2.5(Scala)中使用CSRF令牌进行测试请求

我的功能测试遇到了一个小问题.

我玩了!2.5 scala项目,其中我在某些表单上添加了CSRF验证,相关的scala-test单元测试失败,正如预期的那样,错误:

java.lang.RuntimeException: No CSRF token present!
Run Code Online (Sandbox Code Playgroud)

我正在使用FakeRequest和路由来测试它们:

val fakeRequest   = FakeRequest(GET, s"/backOffice/login")
val Some(result)  = route(app, fakeRequest)
Run Code Online (Sandbox Code Playgroud)

我怎样才能添加CRSF令牌以使我的测试再次成功?

(谢谢你,抱歉英语不好,我不是本地人)

unit-testing scala playframework playframework-2.5

9
推荐指数
1
解决办法
1991
查看次数

Actor中的WebSocket.acceptWithActor和@Inject()(Play 2.5)

WebSocket.acceptWithActor 在不使用Guice的情况下实例化一个新的Akka演员.

使用Play 2.4,仍然可以通过导入为我的演员使用注入器play.api.Play.current.

来自ReactiveMongo文档的片段:

import scala.concurrent.Future

import play.api.Play.current // should be deprecated in favor of DI
import play.api.libs.concurrent.Execution.Implicits.defaultContext

import play.modules.reactivemongo.ReactiveMongoApi
import play.modules.reactivemongo.json.collection.JSONCollection

object Foo {
  lazy val reactiveMongoApi = current.injector.instanceOf[ReactiveMongoApi]

  def collection(name: String): Future[JSONCollection] =
    reactiveMongoApi.database.map(_.collection[JSONCollection](name))
}
Run Code Online (Sandbox Code Playgroud)

但在Play 2.5中,play.api.Play.current已弃用.我怎么还能注入ReactiveMongoApi我的演员?ReactiveMongoApi在我的演员中使用实例的推荐方法是什么?

这里是我的代码与播放2.4,因为我的自定义角色类作品ClientActor必须获得ReactiveMongoApi通过current.injector.instanceOf[ReactiveMongoApi]:

@Singleton
class Application @Inject() (system: ActorSystem) extends Controller {

  val midiDiscoveryActor = system.actorOf(MidiDiscoveryActor.props, "midi-discovery-actor")
  val midiActor = system.actorOf(MidiActor.props(midiDiscoveryActor), "midi-actor")

  def index(page: String) …
Run Code Online (Sandbox Code Playgroud)

dependency-injection guice akka playframework playframework-2.5

9
推荐指数
1
解决办法
266
查看次数

如何使用akka流重构此代码.

我们的想法是保持频道开放以便以后使用它.在playframework 2.5.x中,文档说你必须使用akka流,但没有说明如何实现这个例子.有人可以帮帮我吗?

import play.api.mvc._
import play.api.libs.iteratee._
import play.api.libs.concurrent.Execution.Implicits.defaultContext

def socket =  WebSocket.using[String] { request =>

  // Concurrent.broadcast returns (Enumerator, Concurrent.Channel)
  val (out, channel) = Concurrent.broadcast[String]

  // log the message to stdout and send response back to client
  val in = Iteratee.foreach[String] {
    msg => println(msg)
      // the Enumerator returned by Concurrent.broadcast subscribes to the channel and will
      // receive the pushed messages
      channel push("I received your message: " + msg)
  }
  (in,out)
}
Run Code Online (Sandbox Code Playgroud)

akka playframework playframework-2.5

8
推荐指数
1
解决办法
1139
查看次数

玩!Scala 2.5:测试类注入缓存会导致错误

我第一次使用Play的缓存!Scala 2.5.除了测试之外,它运行良好.

我的测试仍然通过,因为我不需要缓存但是我得到了这个错误(还有很多其他人告诉同样的事情):

Unable to provision, see the following errors:

1) Error in custom provider, play.api.cache.EhCacheExistsException: An EhCache instance with name 'play' already exists.
Run Code Online (Sandbox Code Playgroud)

我理解错误,但我没有设法实现我自己的缓存API版本(模拟它).

我试着在播放邮件列表上做了什么,但没有成功(因为模块是依赖注入的,所以与Play!2.4存在一些差异).欢迎任何帮助.

编辑:我做了什么(并没有改变任何东西):

我的CacheApi版本(仅用于测试):

class MyCacheApi extends CacheApi {
  lazy val cache = {
    val manager = CacheManager.getInstance()
    manager.addCacheIfAbsent("play")
    manager.getCache("play")
  }

  def set(key: String, value: Any, expiration: Duration = Duration.Inf) = {}

  def remove(key: String) = {}

  def getOrElse[A: ClassTag](key: String, expiration: Duration = Duration.Inf)(orElse: => A): A = {
    get[A](key).getOrElse {
      val …
Run Code Online (Sandbox Code Playgroud)

caching scala playframework-2.5

8
推荐指数
1
解决办法
2473
查看次数