小编djs*_*dog的帖子

在Play 2.1和Scala中编写用于文件上载的测试用例

我发现了以下问题/答案:

在Play 2.0 FakeRequest中测试MultipartFormData

但似乎Play 2.1中的情况发生了变化.我试过调整这样的例子:

"Application" should {

"Upload Photo" in {
  running(FakeApplication()) {
    val data = new MultipartFormData(Map(), List(
        FilePart("qqfile", "message", Some("Content-Type: multipart/form-data"), 
            TemporaryFile(getClass().getResource("/test/photos/DSC03024.JPG").getFile()))
        ), List())
    val Some(result) = routeAndCall(FakeRequest(POST, "/admin/photo/upload", FakeHeaders(), data)) 
    status(result) must equalTo(CREATED)
    headers(result) must contain(LOCATION)
    contentType(result) must beSome("application/json")  
Run Code Online (Sandbox Code Playgroud)

但是每当我尝试运行请求时,我都会得到一个空指针异常:

[error] ! Upload Photo
[error]     NullPointerException: null (PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3$$anonfun$apply$4.apply(PhotoManagementSpec.scala:28)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3$$anonfun$apply$4.apply(PhotoManagementSpec.scala:25)
[error] play.api.test.Helpers$.running(Helpers.scala:40)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
Run Code Online (Sandbox Code Playgroud)

如果我尝试用刚刚路由替换已弃用的routeAndCall(并删除结果周围的Option),我会收到一个编译错误,指出它无法将一个MultipartFormData [TemporaryFile]实例写入HTTP响应.

使用Scala在Play 2.1中设计此测试的正确方法是什么?


编辑:尝试修改代码以仅测试控制器:

"Application" should {

"Upload Photo" in {

   val data = new …
Run Code Online (Sandbox Code Playgroud)

testing scala specs2 playframework-2.0

10
推荐指数
3
解决办法
5343
查看次数

使用groovy-all jar运行Groovy脚本时,如何指定类路径?

我找到了一个在没有使用groovy-all jar文件安装Groovy的系统上运行Groovy脚本的示例.我尝试了以下方法:

java -cp src:.:lib/* -jar lib/groovy-all-2.0.1.jar src/com/example/MyScript.groovy
Run Code Online (Sandbox Code Playgroud)

问题是我的脚本依赖于lib目录中的jar以及位于src/com/examples中的另外两个Groovy脚本文件.当我运行它时,它会抱怨所有这些的import语句.我可以通过使用以下方法在安装了Groovy的系统上运行它:

CLASSPATH="src:.:lib/*" groovy src/com/example/MyScript.groovy 
Run Code Online (Sandbox Code Playgroud)

如何使用groovy-all jar以这种方式运行Groovy脚本,并为其提供类路径?

java groovy classpath

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

从Play2/Scala内存中的MultipartFormData中提取文件

我目前正在使用以下Play2/Scala,使用FileUploader Javascript实用程序将文件上传到我的服务器:

def fileUploader = Action(parse.multipartFormData) { request =>
  request.body.file("qqfile").map { picture =>
    import java.io.File
    val filename = picture.filename 
    val contentType = picture.contentType
    picture.ref.moveTo(new File("/tmp",filename))
    Ok(Json.toJson(Map( "success" -> "true" )))
  }.getOrElse {
    Ok(Json.toJson(Map( "error" -> "error occured")))
  }
}
Run Code Online (Sandbox Code Playgroud)

我只处理小文件(<10MB),我想使用casbah使用Mongo驱动程序将这些文件直接写入Mongo文档或GridFS.我意识到我可以从磁盘读取保存的文件,但有没有办法从内存中处理这一切而不先在磁盘上缓冲文件?

这里的播放文档建议编写一个自定义BodyParser(http://www.playframework.com/documentation/2.1.0/ScalaFileUpload),但似乎没有任何关于如何编写一个的文档.目前尚不清楚Scaladocs的API /实现是如何工作的.我尝试查找MultiPartFormData源代码以查看它是如何工作的,但我似乎无法在他们的Git仓库中找到它:

https://github.com/playframework/Play20/tree/master/framework/src/play/src/main/scala/play/api/mvc

我搜索了很多,但似乎找不到一个很好的例子.

buffer scala file-upload playframework-2.0

8
推荐指数
2
解决办法
3836
查看次数

使用 ImageMagick 将多个图像组合在一个正方形中并调整其大小

所以我想创建一张由三张较小图像组成的尺寸为 3600x2280 的大图像。第一个应将大小调整为 1680x1050 并放置在左上角。第二个需要调整为 1920x1200 并立即放置在其右侧(+1680 以上)。第三张图片的大小应调整为 1920x1080 并放置在右下角 (+1680+1200)。左下角将是空白/透明的。

我尝试过在网上搜索的各种命令,并且认为对于三张图像中的两张来说,我已经有点接近如下所示的命令:

convert -define png:size=3600x2280 \( Photos/DSC05525-original.jpg -resize 1680x1050 \) -geometry +0+0 -composite \( Photos/Sydney-Loftus-Train-Station-original.jpg -resize 1920x1200 \) -geometry +1680+0 -extent 3600x2280 test.png
Run Code Online (Sandbox Code Playgroud)

...但这将第二张图像放在第一张图像上(我想是因为它不知道延伸到最后?)。我尝试过 -composite、-gravity 和 +repage 的各种组合,但似乎找不到解决方案。

imagemagick montage imagemagick-convert

6
推荐指数
1
解决办法
3509
查看次数

麻烦在Python和Java/Scala之间插入RSA签名

我正在使用python-crypto API在Python2中编写一个客户端来对XML文件进行数字签名,我有一个用Scala编写的服务,用于验证签名.我的Python代码看起来像这样:

from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from os import urandom
import logging

...
...
Run Code Online (Sandbox Code Playgroud)

要生成密钥(keysize为2048):

self.__key = RSA.generate(self.keySize,urandom)
self.__private_key = self.__key.exportKey()
self.__public_key = self.__key.publickey().exportKey()
with open(pubPath,'w') as fpub:
    logging.info("Writing Public Key to %s" % pubPath)
    fpub.write(self.__public_key)
with open(priPath,'w') as fpri:
    logging.info("Writing Private Key to %s" % priPath)
    fpri.write(self.__private_key)
Run Code Online (Sandbox Code Playgroud)

并且用于阅读键:

self.__private_key = fpri.read()
self.__public_key = fpub.read()
self.__key = RSA.importKey(self.__private_key)
Run Code Online (Sandbox Code Playgroud)

并进行数字签名

logging.debug('Data to sign: "%s"' % data)
digest = SHA.new(data.strip()).digest()
return str(self.__key.sign(digest, None)[0])
Run Code Online (Sandbox Code Playgroud)

然后在Scala/Java中,我使用以下内容:

package com.example.security
import com.example.action.ActionRequest …
Run Code Online (Sandbox Code Playgroud)

python java scala rsa digital-signature

5
推荐指数
1
解决办法
884
查看次数

防止 MySQL JDBC 驱动程序将日期时间转换为本地时间

我在 Stack Overflow 和邮件列表上找到了许多帖子,这些帖子记录了 MySQL JDBC 问题,包括时区、日期时间等。但即使如此,我仍然无法弄清楚这一点。我正在使用如下所示的连接字符串:

 jdbc:mysql://localhost:3306/BigSense?useLegacyDatetimeCode=false&serverTimezone=UTC
Run Code Online (Sandbox Code Playgroud)

我使用以下方法插入日期:

 stmt.setTimestamp(x, s, Calendar.getInstance(TimeZone.getTimeZone("UTC")))
Run Code Online (Sandbox Code Playgroud)

并且日期确实以UTC时间正确存储在MySQL中的DateTime列中。我可以从控制台执行 SELECT 并以我将其发送到服务器的时间格式查看它。问题是当我在 Java/JDBC 中执行 SELECT 时,它出于某种原因将其转换为我的本地时区!我使用如下 Scala 代码:

        using(stmt.getResultSet()) {
      ret =>
        if (ret != null) {

          val meta = ret.getMetaData()

          var retbuf = new ListBuffer[Map[String, Any]]()
          while (ret.next) {
            val rMap = scala.collection.mutable.Map[String, Any]()

            for (i <- 1 to meta.getColumnCount()) {
              rMap += (meta.getColumnLabel(i) -> ret.getObject(i))
            }
Run Code Online (Sandbox Code Playgroud)

这是旧的 Scala 代码,所以不要评判我。我意识到我不应该使用 retval 并且有更多的“Scala”方法来写这个:)

无论如何,我已经尝试了一些变化,我检查它是否特别是“时间”列并使用 getTimestamp 代替,无论有没有日历对象选项,我仍然将时间转换为本地时间!

这是针对 BigSense 项目的,我试图在其中支持多个数据库(目前完全支持 Postgres 和 MS SQL),因此我试图使代码尽可能通用/不可知。可以在此处找到我的数据库内容的完整来源:

https://github.com/sumdog/BigSense/blob/master/src/main/scala/io/bigsense/db/DataHandlerTrait.scala
Run Code Online (Sandbox Code Playgroud)

哦,我还尝试了以下方法:

 noTimezoneConversionForTimeType=true
Run Code Online (Sandbox Code Playgroud)

并且仍然得到相同的结果。我的本地机器设置为 …

java mysql sql datetime jdbc

5
推荐指数
1
解决办法
1324
查看次数

如何在 Terraform 中为 Amazon ECR 创建 IAM 角色?

在这个答案的后面,我试图创建一个aws_iam_role允许访问 ECR 的。但是,当我定义以下内容时:

resource "aws_iam_role" "jenkins_ecr_role" {
  name = "JenkinsECRRole"

  assume_role_policy = <<END_OF_POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecr.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
END_OF_POLICY
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Error: Error creating IAM Role JenkinsECRRole:
MalformedPolicyDocument: Invalid principal in policy: "SERVICE":"*"
Run Code Online (Sandbox Code Playgroud)

ecr.amazonaws.com根据 AWS 文档,它看起来是一个有效的委托人。我究竟做错了什么?

amazon-web-services amazon-iam terraform amazon-ecr terraform-provider-aws

5
推荐指数
1
解决办法
5262
查看次数

Microsoft SQL和JDBC中的Prepared Statements中奇数位置的参数

所以我在Microsoft SQL 2008中执行以下语句:

  SELECT
  'UTC' AS timezone,
  rel.unique_id AS relay,sns.unique_id AS sensor,
  dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) AS time,
  SUM(CONVERT(FLOAT,dat.data)) AS total
  FROM sensor_data dat
   LEFT OUTER JOIN data_package pak ON dat.package_id = pak.id
   LEFT OUTER JOIN relays rel ON pak.relay_id = rel.id
   LEFT OUTER JOIN sensors sns ON dat.sensor_id = sns.id
   LEFT OUTER JOIN sensor_types typ ON sns.sensor_type = typ.id
   WHERE typ.name = 'Volume' AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) > …
Run Code Online (Sandbox Code Playgroud)

java sql scala jdbc sql-server-2008

4
推荐指数
1
解决办法
956
查看次数

JSON 模式,它允许一个对象或这些对象的数组

假设我有一个 JSON 模式,它允许像这样的对象:

...
  "assetMetadata": {
    "type": "object",
    "additionalProperties": false,
    "properties": { ... }
  }
...
Run Code Online (Sandbox Code Playgroud)

所以说我想改变它以允许相同的对象或该特定对象的数组。这里只接受一个数组:

...
"assetMetadata": {
  "type": "array",
  "description": "...",
  "items": {
    "type": "object",
    "additionalProperties": false,
    "properties": {...}
}
...
Run Code Online (Sandbox Code Playgroud)

属性是相同的(它是同一个对象,只是多个而不是一个的选项)。

有趣的是,在我正在进行的项目中,解组器已经可以处理这两种情况(它将单个对象转换为大小为 1 的序列),因此纯粹是验证阻止了我继续前进。我们希望保持与现有 API 的可比性,这就是我现在不能只需要一个数组的原因。

json jsonschema

4
推荐指数
1
解决办法
1632
查看次数

在play中的Specs2测试给我"找不到org.specs2.main.CommandLineAsResult类型的证据参数的隐含值

我正在尝试为Play2/Scala中的一个发送/接收JSON的简单REST API编写测试用例.我的测试如下所示:

import org.junit.runner.RunWith
import org.specs2.matcher.JsonMatchers
import org.specs2.mutable._
import org.specs2.runner.JUnitRunner
import play.api.libs.json.{Json, JsArray, JsValue}
import play.api.test.Helpers._
import play.api.test._
import play.test.WithApplication

/**
  * Add your spec here.
  * You can mock out a whole application including requests, plugins etc.
  * For more information, consult the wiki.
  */

@RunWith(classOf[JUnitRunner])
class APIv1Spec extends Specification with JsonMatchers {

  val registrationJson = Json.parse("""{"device":"576b9cdc-d3c3-4a3d-9689-8cd2a3e84442", |
                             "firstName":"", "lastName":"Johnny", "email":"justjohnny@test.com", |
                             "pass":"myPassword", "acceptTermsOfService":true}
                                """)

  def dropJsonElement(json : JsValue, element : String) = (json \ element).get match {
    case …
Run Code Online (Sandbox Code Playgroud)

scala playframework specs2 playframework-2.0

3
推荐指数
1
解决办法
3155
查看次数

在 Scala 中的 Doobie 上的事务中获取或插入

我正在阅读 Doobie 文档并尝试在事务中进行简单的获取或创建。我从第一个查询中获得了一个选项,并尝试getOrElse在 else 中执行一个并运行一个插入,但是我一直value map is not a member of AnygetOrElse调用中获得一个。获取现有行或创建新行instances并在事务中返回该结果的正确方法是什么?

import doobie._
import doobie.implicits._
import cats._
import cats.effect._
import cats.implicits._
import org.joda.time.DateTime

import scala.concurrent.ExecutionContext

case class Instance(id : Int, hostname : String)

case class User(id : Int, instanceId: Int, username : String, email : String, created : DateTime)

class Database(dbUrl : String, dbUser: String, dbPass: String) {

  implicit val cs = IO.contextShift(ExecutionContext.global)

  val xa = Transactor.fromDriverManager[IO](
    "org.postgresql.Driver", dbUrl, dbUser, dbPass …
Run Code Online (Sandbox Code Playgroud)

sql scala doobie

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

kubernetes autoscaler不会缩小节点

我正在使用AWSKubernetes 自动缩放器。我已使用以下命令部署它:

          command:
            - ./cluster-autoscaler
            - --v=4
            - --stderrthreshold=info
            - --cloud-provider=aws
            - --skip-nodes-with-local-storage=false
            - --nodes=1:10:nodes.k8s-1-17.dev.platform
Run Code Online (Sandbox Code Playgroud)

但是,自动缩放器似乎无法启动缩放。日志显示它找到一个未使用的节点,但随后不会缩小它,也不会给我错误(显示“无节点组配置”的节点是主节点)。

I0610 22:09:37.164102       1 static_autoscaler.go:147] Starting main loop
I0610 22:09:37.164462       1 utils.go:471] Removing autoscaler soft taint when creating template from node ip-10-141-10-176.ec2.internal
I0610 22:09:37.164805       1 utils.go:626] No pod using affinity / antiaffinity found in cluster, disabling affinity predicate for this loop
I0610 22:09:37.164823       1 static_autoscaler.go:303] Filtering out schedulables
I0610 22:09:37.165083       1 static_autoscaler.go:320] No schedulable pods
I0610 22:09:37.165106       1 static_autoscaler.go:328] No unschedulable …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services autoscaling kubernetes

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