在为Scala (Version2.3.x)解析专用字符(例如èe、é和for )时,我遇到了问题。由于游戏中的所有内容都是UTF-8编码的,所以上述示例(è,é,和)不应成为问题。我应该提到,我正在使用IntelliJ和sbt进行我的开发。
我已经核实了以下情况:
测试文件:
{"id":"295b1590-220a-11e4-b641-90e08f355b68","blah":"è é ®"}主计长:
def putGuid(streamId: String, guid: UUID) = Action.async(parseToEventContent) {
implicit request =>
render.async {
case mimeType@(Accepts.Json()) =>
val id = msgId.next()
(request.body match {
case JsonEventContent(j) =>
eventActor ? SendEventMessages.SendJsonEvent(id, streamId, Some(guid), remoteAddress(request), j)
case ... some other cases...
}) map {
case SendEventMessages.Done(`id`) => NoContent
case ... more error cases.. blah blah ...
case SendEventMessages.Unknown(`id`) =>
Logger.info("Message ID: {}. Received an unknown from underlying actors", id.asInstanceOf[AnyRef])
ServiceUnavailableRetryAfter()
} recover exceptionErrorHandler
} }其中BodyParser是:
trait EventContent {}
case class JsonEventContent(data: JsValue) extends EventContent
def parseToEventContent: BodyParser[EventContent] = BodyParser("eventContent") {
request =>
import play.api.libs.iteratee.Execution.Implicits.trampoline
request.contentType match {
case Some(MimeTypes.JSON) => parse.tolerantJson(request).map(_.right.map(JsonEventContent(_)))
case _ => Done(Left(UnsupportedMediaType), Empty)
}
}编辑#1
在我的测试中使用类似于下面的内容会给出“èé”的400个错误,而对于"abc“则给出204个错误(我的源文件是utf-8,javac被设置为在build.sbt中使用uff-8 ):
val eventC = Json.parse(new String(s"""{"id":"295b1590-220a-11e4-b641-90e08f355b68","blah":"è é ®"}""".getBytes("UTF-8"), "UTF-8"))
val eventCJson = eventC.toString().getBytes("UTF-8")
"return 204 when entity has è, é, ® in json event" in new WithApplication(MyFakeApplication()){
println(s"json=${eventC}")
val result = assertPutRequest(s"/streams/com.gilt.clickstream/events/295b1590-220a-11e4-b641-90e08f355b68", 204, event = eventCJson, "application/json", "application/json; charset=utf-8")
contentType(result) must be equalTo None
contentAsBytes(result) must be equalTo Array()
}
def assertPutRequest(url: String, httpStatus: Int, event: Array[Byte], acceptHeader: String = "application/json", contentTypeHeader: String = "application/json; charset=utf-8")(implicit app: Application) = {
Akka.system.actorOf(MockEventActor.props, "event")
val result = route(
FakeRequest(PUT, url)
.withHeaders(
"Accept" -> acceptHeader,
"Content-Type" -> contentTypeHeader)
.withRawBody(event)
)(new Writeable({ j: AnyContentAsRaw => j.raw.asBytes().get}, None)).get
status(result) must be equalTo httpStatus
result
}发布于 2015-05-01 23:28:18
这个问题的解决方案是升级到JDK1.7。我使用的是JDK1.6,这导致了这个问题。
https://stackoverflow.com/questions/29611663
复制相似问题