我的Play应用程序会自动生成一些HTML电子邮件,这当然会引用服务器上的一些图像.由于HTML电子邮件需要完整的URL才能在客户端获取图像,因此我在我的基础URL中定义了基本URL application.conf,然后在视图模板中构建完整路径.那说,有没有办法获得public/images目录的完整URL,以便我不再需要额外的配置?
谢谢.
下面是使用Mongo更新文档的代码FindAndModify:
val selector = BSONDocument("id" -> "1234")
val modifier = BSONDocument("$set" -> BSONDocument("email" -> "new@domain.com"))
ReactiveMongoPlugin.db.command(FindAndModify(
collection.name,
selector,
Update(modifier, false),
false,
None
)).transform(
success => success.map { s =>
// doesn't work...
Json.fromJson[Seq[JsValue]](toJson(s)).map(for (item <- _) yield item).get
}.getOrElse(List[JsValue]()),
failure => failure match {
case e: LastError => DaoServiceException(e.message, Some(DATABASE_ERROR))
}
)
Run Code Online (Sandbox Code Playgroud)
在success块我试图将返回的BSONDocument集合转换为JsValue集合...但它不起作用,结果JsValue集合总是空的(我已经验证BSONDocument了命令返回的集合,我确认它是非空的).我错过了什么吗?
鉴于以下JSON ......
{ "id":"1234",
"name" -> "joe",
"tokens: [{
"id":"1234",
"id":"2345"
}]
}
Run Code Online (Sandbox Code Playgroud)
...我需要像这样替换所有ids 的值xxxx:
{ "id":"xxxx",
"name" -> "joe",
"tokens: [{
"id":"xxxx",
"id":"xxxx"
}]
}
Run Code Online (Sandbox Code Playgroud)
让我们开始创建JSON树:
val json = Json.obj(
"id" -> "1234",
"name" -> "joe",
"tokens" -> Json.arr(
Json.obj("id" -> "1234"),
Json.obj("id" -> "2345")
)
)
json: play.api.libs.json.JsObject = {"id":"1234","name":"joe","tokens":[{"id":"1234"},{"id":"2345"}]}
Run Code Online (Sandbox Code Playgroud)
然后,获取所有ids非常简单:
json \\ "id"
res64: Seq[play.api.libs.json.JsValue] = List("1234", "1234", "2345")
Run Code Online (Sandbox Code Playgroud)
现在,我该如何替换所有ids 的值xxxx?
给定以下JsValue实例序列:
[
{ "name":"j3d" },
{ "location":"Germany" }
]
Run Code Online (Sandbox Code Playgroud)
如何将它们合并到这样的单个JSON文档?
{
"name":"j3d",
"location":"Germany"
}
Run Code Online (Sandbox Code Playgroud)
以下是我的Scala代码:
import play.api.libs.json._
val values = Seq(Json.obj("name":"j3d"), Json.obj("location":"Germany")
Run Code Online (Sandbox Code Playgroud)
如何合并所有JSON对象values?
鉴于以下自定义Exception...
trait ServiceException extends RuntimeException {
val errorCode: Int
}
object ServiceException {
def apply(
message: String, _errorCode: Int
): ServiceException = new RuntimeException(message) with ServiceException {
val errorCode: Int = _errorCode
}
def apply(
message: String, cause: Throwable, _errorCode: Int
): ServiceException = new RuntimeException(message, cause) with ServiceException {
val errorCode: Int = _errorCode
}
}
Run Code Online (Sandbox Code Playgroud)
... 和以下方法返回一个Future...
myService.doSomethingAndReturnFuture.map {
...
}.recover {
case ServiceException(5) =>
Logger.debug("Error 5")
// this does not work
// case …Run Code Online (Sandbox Code Playgroud) 给出以下采用Map[String, Option[String]]参数的方法:
def myMethod(m: Map[String, Option[String]]) = {
...
}
Run Code Online (Sandbox Code Playgroud)
如何定义一个MyMap实现的新类型,Map[String, Option[String]]使方法如下所示:
def myMethod(m: MyMap) = {
...
}
Run Code Online (Sandbox Code Playgroud) 在下面Controller,Authenticated从请求标头中提取标记,并且当且仅当标记有效时才调用给定的操作(为简单起见,代码已经简化):
object MyController extends Controller {
def Authenticated(action: Token => EssentialAction) = EssentialAction { requestHeader =>
val jwt = requestHeader.headers.get(HeaderNames.AUTHORIZATION) match {
case Some(header) => s"""$AuthScheme (.*)""".r.unapplySeq(header).map(_.head.trim)
case _ => requestHeader.getQueryString("auth").map(UriEncoding.decodePath(_, SC.US_ASCII.name))
}
jwt match {
case Some(t) if t.isValid =>
val token: Token = authService.token(t)
action(token)(requestHeader)
case _ => Done(Unauthorized.withHeaders(HeaderNames.WWW_AUTHENTICATE -> AuthScheme))
}
}
def getUser(userId: String) = Authenticated { token =>
Action.async { request =>
userService.find(userId).map {
case Some(user) => Ok(Json.obj("user" -> user.asJson)).withHeaders(
"token" …Run Code Online (Sandbox Code Playgroud) 我需要从URL中提取主机名和端口(如果有的话),下面是我的代码:
val regEx = """^(?:https?:\/\/)?(?:www\.)?(.*?)\//""".r
val url = regEx.split("http://www.domain.com:8080/one/two")
val hostname = url(url.length - 1).split("/")(0).split(":")(0)
val hasPort = url(url.length - 1).split("/")(0).split(":").length > 1
val port = if (hasPort) url(url.length - 1).split("/")(0).split(":")(1) else 80
Run Code Online (Sandbox Code Playgroud)
上面的代码按预期工作...但在Scala中肯定有更好的方法来获得相同的结果.
如何在不使用所有丑陋的splits的情况下获取主机名和端口(如果有的话)?
鉴于以下代码片段
package main
import (
"fmt"
)
type Message string
const (
ConnectRepositoryError Message = "failed to connect %s repository"
)
func main() {
fmt.Println(ConnectRepositoryError.M("user"))
}
func (m Message) M(args ...string) string {
return fmt.Sprintf(string(m), args)
}
Run Code Online (Sandbox Code Playgroud)
... 为什么fmt.Sprintf将指定的字符串 ( user) 括在方括号中?
failed to connect [user] repository
Run Code Online (Sandbox Code Playgroud)
我希望这个输出:
failed to connect user repository
Run Code Online (Sandbox Code Playgroud)