我有一个使用scala构建的带有Play框架v2.3的JSON REST API服务器,我有这样的控制器动作,例如:
def register = Action.async(BodyParsers.parse.json) { implicit request =>
request.body.validate[Register].fold(
errors => Future.successful(BadRequest(JsError.toFlatJson(errors))),
register => {
// do something here if no error...
}
)
}
Run Code Online (Sandbox Code Playgroud)
为简单起见,我处理了验证错误JsError.toFlatJson(注意:JsError.toFlatJson在较新的Play中不推荐使用,替换是JsError.toJson).
问题是json结果有如下隐秘的消息:
{"obj.person.email":[{"msg":"error.email","args":[]}]}
以上json表示该人的电子邮件无效.
有没有办法将错误json结果转换为更可读的消息?
我不希望客户端应用程序应该做的映射/转换obj.person.email或error.email.我更喜欢服务器在将json返回到客户端应用程序之前执行此操作.
任何人都可以告诉我如何使用Scala将POJO或类实例转换为Play框架中的JSON(特别是Play v2.3.x)?
例如,我有这样的代码:
case class Foo(name: String, address: String)
def index = Action {
request => {
val foo = Foo("John Derp", "Jem Street 21") // I want to convert this object to JSON
Ok(Json.toJson(foo)) // I got error at here
}
}
Run Code Online (Sandbox Code Playgroud)
错误消息:
无法将com.fasterxml.jackson.data bind.JsonNode的实例写入HTTP响应.尝试定义一个可写的[com.fasterxml.jackson.databind.JsonNode]
更新:我发现上面的错误是由于错误导入Json类引起的,应该是:import play.api.libs.json.Json.但是我仍然在下面的隐含问题上有错误.
我已经阅读了本教程,但是当我尝试隐式Writes[Foo]代码时:
implicit val fooWrites: Writes[Foo] = (
(JsPath \ "name").write[String] and
(JsPath \ "address").write[String]
)(unlift(Foo.unapply))
Run Code Online (Sandbox Code Playgroud)
我Can't resolve symbol and和Can't resolve …
我在jsp中有一个表单.有两个提交按钮:"搜索"和"添加新"按钮.我已经为每个按钮设置了自己的方法属性.
<s:form name="searchForm" action="employeeAction" method="post">
<s:textfield name="id" label="Employee ID"/>
<s:textfield name="name" label="Employee Name"/>
<s:submit value="Search" method="doSearch"/>
<s:submit value="Add New" method="doAddNew"/>
</s:form>
Run Code Online (Sandbox Code Playgroud)
在struts.xml中
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
</package>
<package name="example" namespace="/example" extends="default">
<action name="employeeAction" class="example.EmployeeAction">
<result name="search">/example/search.jsp</result>
<result name="add">/example/add.jsp</result>
</action>
</package>
</struts>
Run Code Online (Sandbox Code Playgroud)
在EmployeeAction类中
public class EmployeeAction …Run Code Online (Sandbox Code Playgroud) 我在jsp中有一个表单.有两个提交按钮:"搜索"和"添加新"按钮.
<s:form name="searchForm" action="employeeAction" method="post">
<s:textfield name="id" label="Employee ID"/>
<s:textfield name="name" label="Employee Name"/>
<s:submit value="Search"/>
<s:submit value="Add New"/>
</s:form>
Run Code Online (Sandbox Code Playgroud)
在 struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index" />
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
</package>
<package name="example" namespace="/example" extends="default">
<action name="employeeAction" class="example.EmployeeAction">
<result name="search">/example/search.jsp</result>
<result name="add" type="redirect">/example/add.jsp</result>
</action>
</package>
</struts>
Run Code Online (Sandbox Code Playgroud)
在Struts Action类中,我们知道只有一种方法可以处理http请求,即execute()方法. …
我有这个HTML:
<div id="content">
<h1>Title 1</h1><br><br>
<h2>Sub-Title 1</h2>
<br><br>
Description 1.<br><br>Description 2.
<br><br>
<h2>Sub-Title 2</h2>
<br><br>
Description 1<br>Description 2<br>
<br><br>
<div class="infobox">
<font style="color:#000000"><b>Information Title</b></font>
<br><br>Long Information Text
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我希望<div id="content">在Scrapy 中使用XPath 获取所有文本,但不包括<div class="infobox">内容,因此预期结果如下:
Title 1
Sub-Title 1
Descripton 1.
Descripton 2.
Sub-Title 2
Descripton 1.
Descripton 2.
Run Code Online (Sandbox Code Playgroud)
但是我还没有到达排除部分,我仍然在努力从中获取文本<div id="content">.
我试过这个:
response.xpath('//*[@id="content"]/text()').extract()
Run Code Online (Sandbox Code Playgroud)
但它只返回Description 1.并Description 2.从两个子标题返回.
然后我尝试了:
response.xpath('//*[@id="content"]//*/text()').extract()
Run Code Online (Sandbox Code Playgroud)
它只返回Title 1,Sub-Title 1,Sub-Title 2,Information Title,和 …
这些代码中这些下划线用法之间有什么区别和术语名称:(参见handler(resource)部分)
1.
def readFile[T](f: File)(handler: FileInputStream => Byte => T): T = {
val resource = new java.io.FileInputStream(f)
try {
val hh = handler(resource)_
hh(2)
} finally {
resource.close()
}
}
val bs = new Array[Byte](4)
readFile(new File("scala.txt")) {
input => b: Byte => println("Read: " + (input.read(bs) + b))
}
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
Error:(55, 29) _ must follow method; cannot follow Byte => T
val hh = handler(resource)_
^
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
2.
def readFile[T](f: File)(handler: FileInputStream => Byte => T): …Run Code Online (Sandbox Code Playgroud) 我有一个用于PreferenceActivity的xml文件(/res/xml/setting.xml):
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory android:title="Main Settings">
<ListPreference
android:title="Background Image"
android:summary="Set the background image"
android:key="key_background"
android:entries="@array/background"
android:entryValues="@array/background_values"
android:defaultValue="winter.png" />
</PreferenceCategory>
</PreferenceScreen>
Run Code Online (Sandbox Code Playgroud)
然后我有另一个xml文件"/res/values/string.xml":
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="background">
<item>Winter</item>
<item>Desert</item>
</string-array>
<string-array name="background_values">
<item>winter.png</item>
<item>desert.png</item>
</string-array>
</resources>
Run Code Online (Sandbox Code Playgroud)
请参阅setting.xml中的ListPreference,我想android:defaultValue设置为winter.png.但是我也不想在xml中设置硬编码/常量值,所以我尝试了各种值,如" @array/background_values/0"," @array/background_values[0]"等...但都失败了.
所以,问题是:
android:defaultValue是否正常工作?@array语法的文档?我找不到任何东西.我有一张图片:background.png。如何使用 android OpenGL ES 或 AndEngine 库或您知道的其他技术创建连续重复滚动的背景图像?
例子:

目前,我使用两个相邻图像技术。我加载图像(background.png)两次并将它们相邻放置,然后移动它们。所以它看起来就像是一张连续滚动的图像。
但是,不知何故,我认为仅使用一个图像实例可能会有更好的解决方案。有谁可以分享一下吗?
更新:
对于好奇的人来说,这是两个相邻图像的代码(使用 AndEngine 库):
movingBackgroundSprite.registerEntityModifier(new LoopEntityModifier(
new MoveYModifier(10, -CAMERA_HEIGHT, 0)));
movingBackgroundSprite2.registerEntityModifier(new LoopEntityModifier(
new MoveYModifier(10, 0, CAMERA_HEIGHT)));
Run Code Online (Sandbox Code Playgroud)
上面的代码是关于重复制作背景图像并从上到下垂直滚动。
注意:
* movingBackgroundSprite 是加载background.png 图像的Sprite 类。您可以看到背景精灵有两个实例。
* registerEntityModifier -> 为 Sprite 应用修改器/行为
* LoopEntityModifier -> 循环行为
* MoveYModifier -> 按 y 位置移动行为。第一个参数是持续时间(您可以忽略它,因为它与问题无关),第二个参数是源 Y 位置,第三个参数是目标 Y 位置。
* CAMERA_HEIGHT -> 定义背景图像高度的常量。
假设我们有这个带注释的方法:
@Cached(key="search" + id)
public static List<String> search(String id) {
//...
}
Run Code Online (Sandbox Code Playgroud)
我想将参数“id”传递给 @Cached 注释的键。
可以在java中做到这一点吗?
我在这里阅读了其他相同的问题,但是对于某些内置类来说,这种情况太具体了。我想在这里问一个简单的案例,希望能得到一般的答案。
所以我有这段代码:
object ScalaApp {
case class Point(x: Int, y: Int);
case class Rational(n: Int, d: Int) {
def \(i: Int): List[Int] = n :: d:: i :: Nil
}
case class MyObject(x: Int, y: Int, z: Int) {
def \(i: Int): List[Int] = x :: y:: i :: Nil
}
implicit def pointToRational(p: Point): Rational = Rational(p.x + 1, p.y * 2)
implicit def pointToMyObject(p: Point): MyObject = MyObject(p.x, p.y, p.x+p.y)
def main(args: Array[String]) {
val p …Run Code Online (Sandbox Code Playgroud)