我正在使用play-json的宏来定义隐式Writes序列化JSON.但是,似乎默认情况下play-json省略了字段Option设置为的字段None.有没有办法改变默认值,以便输出null?我知道如果我定义自己的Writes定义,这是可能的,但我有兴趣通过宏来减少样板代码.
例
case class Person(name: String, address: Option[String])
implicit val personWrites = Json.writes[Person]
Json.toJson(Person("John Smith", None))
// Outputs: {"name":"John Smith"}
// Instead want to output: {"name":"John Smith", "address": null}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些案例类序列化/反序列化为Json ...而且在处理只有一个字段的案例类时我遇到了麻烦(我正在使用Play 2.1):
import play.api.libs.json._
import play.api.libs.functional.syntax._
case class MyType(type: String)
object MyType {
implicit val myTypeJsonWrite = new Writes[MyType] {
def writes(type: MyType): JsValue = {
Json.obj(
"type" -> MyType.type
)
}
}
implicit val myTypeJsonRead = (
(__ \ 'type).read[String]
)(MyType.apply _)
}
Run Code Online (Sandbox Code Playgroud)
上面的代码总是生成以下错误消息:
[error] /home/j3d/Projects/test/app/models/MyType.scala:34: overloaded method value read with alternatives:
[error] (t: String)play.api.libs.json.Reads[String] <and>
[error] (implicit r: play.api.libs.json.Reads[String])play.api.libs.json.Reads[String]
[error] cannot be applied to (String => models.MyType)
[error] (__ \ 'method).read[String]
[error] ^
Run Code Online (Sandbox Code Playgroud)
我知道...包含只是一个字符串没有多大意义的情况下,类...但我需要序列化/反序列化的情况下,类非常相似,我上面描述的来自外部库中的一个.
任何的想法?我错过了什么吗?任何帮助将非常感激...我变得疯狂:-(谢谢.
首先,我想说明我认为2.0的Play文档非常非常糟糕.
我正在寻找一种方法在HTML选择下面放置一个验证错误,就像播放一样,它会自动生成一个输入框.
我试图复制播放输入框的结果HTML代码的结构,但我确定我在HTML代码中缺少一些ifError-Scala模板行.
不好的是,找不到Play <2.0文档已涵盖的主题的Play 2.0文档.因此,如果您正在寻找文档中的解决方案,那么您将获得旧的,无法工作的文档.很沮丧!
我正在关注Java的Play Framework 2.0教程,并在尝试保存ebean Model(task.save())时遇到此错误.
[PersistenceException:类型[class models.Task]不是注册实体?如果没有明确列出要使用的实体类,Ebean将在类路径中搜索它们.如果实体位于Jar中,请检查ebean.properties文件中的ebean.search.jars属性,或者检查ServerConfig.addJar().
我有一个问题是实现一个简单的HTTP重定向.
我使用Liferay 6.0.6,我们的portlet是用JSF2.0/PortletFaces构建的.
我想在加载视图时调用重定向(而不是在触发操作时).目前,我的函数由PreRenderView监听器调用.
<f:metadata>
<f:event listener="#{myControler.dispatch}" type="preRenderView" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
在这个函数中,我可以检查权限,做其他的事情,在某些情况下,我想将用户重定向到一个新的页面(而不是另一个视图).
我尝试了几种方法,但没有成功.具体来说,我认为这种方法可行:
getFacesContext().getExternalContext().redirect(url);
getFacesContext().responseComplete()
// => Can only redirect during ACTION_PHASE
Run Code Online (Sandbox Code Playgroud)
这个错误是合乎逻辑的,但是有一个强制重定向的解决方案.
它可以在另一个函数中实现,否则,我只需要Hibernate Session(在渲染阶段的开头设置)
你有想法解决这个问题吗?
谢谢!
ps:<redirect />或者?faces-redirect不使用portlet.
我有一个简单的模型对象:
case class Region(id: String, revision: Option[String], name: String)
object Region {
// Returns Some(region) if successful, None if revision doesn't match the latest
// in the data store
def insertOrUpdate(region: Region): Promise[Option[Region]]
}
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我想做这样的事情,但我不知道如何在响应中指出锁定失败.我想添加一个全局表单错误,但无法从API中看到.
def update(id: String) = Action {
implicit request => regionForm.bindFromRequest.fold(
formWithErrors => BadRequest(views.html.regions.edit(formWithErrors)),
region => Async{
Region.insertOrUpdate(region).map{
_ match {
case None => {
// How do I add a global form error indicating there were server side changes detected
BadRequest(views.html.regions.edit(regionForm.fill(region))
}
case Some(r) => …Run Code Online (Sandbox Code Playgroud) 我有一个Scala案例类
case class Example(name: String, number: Int)
Run Code Online (Sandbox Code Playgroud)
和一个伴侣
object Example {
implicit object ExampleFormat extends Format[Example] {
def reads(json: JsValue) = {
JsSuccess(Example(
(json \ "name").as[String],
(json \ "number").as[Int]))
}
def writes(...){}
}
}
Run Code Online (Sandbox Code Playgroud)
它将JSON转换为Scala对象.
当JSON有效时(即{"name":"name","number": 0}它工作正常.但是,当number引用时{"name":"name","number":"0"}我得到一个错误:validate.error.expected.jsnumber.
有没有一种方法,以隐式转换String到Int在这种情况下(假设号码是有效的)?
我有一个多项目的SBT/Play2应用程序,我需要为主项目发布一个Docker镜像(聚合其他项目).
问题是sbt-native-packager在我的本地仓库中发布所有PLAY项目的图像.根图像工作正常,但我有2个其他图像不应该发布.
我在plugins.sbt中添加了什么
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.0-RC1")
Run Code Online (Sandbox Code Playgroud)
这是我的build.sbt
import Dependencies.Library._
import PlayKeys._
import com.typesafe.sbt.packager.docker._
lazy val root = (project in file("."))
.enablePlugins(PlayScala)
.enablePlugins(DockerPlugin)
.settings(
packageName in Docker := "docking-station",
version in Docker := "latest",
NativePackagerKeys.dockerBaseImage := "dockerfile/java:oracle-java8",
NativePackagerKeys.dockerExposedPorts := Seq(9000, 9443),
NativePackagerKeys.dockerExposedVolumes := Seq("/opt/docker/logs"),
)
.dependsOn(module1).aggregate(module1)
.dependsOn(module2).aggregate(module2)
.dependsOn(core).aggregate(core)
lazy val module1 = (project in file("modules/1"))
.enablePlugins(PlayScala)
.dependsOn(core)
.dependsOn(entities)
lazy val module2 = (project in file("modules/2"))
.enablePlugins(PlayScala)
.dependsOn(core)
lazy val core = (project in file("modules/core"))
Run Code Online (Sandbox Code Playgroud)
这就是我得到的
sbt docker:publishLocal …
sbt playframework docker sbt-native-packager playframework-2.3
我正在尝试将表单绑定到请求但它失败并出现以下错误:
Execution exception
[RuntimeException: Cannot instantiate class controllers.Application$RequestData. It must have a default constructor]
Run Code Online (Sandbox Code Playgroud)
错误描述看起来很简单,但看看代码:
public class RequestData {
@Required
public String id;
public RequestData() { }
public RequestData(String id) {
this.id = id;
}
}
public static Result index() {
...
Form<RequestData> requestDataForm = form(RequestData.class);
RequestData requestData = requestDataForm.bindFromRequest().get();
...
}
Run Code Online (Sandbox Code Playgroud)
您可以看到该类确实具有默认构造函数,因此此错误根本不明确.
有任何想法吗?谢谢.
有趣的是,在官方文档中,他们使用的示例没有默认构造函数.