[英]Scala FOLD executing both invalid and valid blocks of code
我有以下代码,通过控制器验证JSON输入。 我正在使用JSON模式验证,并根据您在代码中看到的有效还是无效来提供响应。 发送无效的JSON时出现以下怪异行为。
[error] - superman - Event=Bad Request Received, Reason=Invalid Json, Response={"GUID":"\"e28fa115-67f4-4265-b7d0-61e6af1237c2\"","status":"error","description":"Invalid Request Received","violations":"List(\"Property action missing\")"}
invalid
successfully inserted document with result = DefaultWriteResult(true,1,List(),None,None,None)
为什么它运行的代码有效区块行mongo.writeDocument(reqJson)
而JSON是无效的,它实际上打印invalid
从无效块。 但是,要注意的另一件事是,即使它在mongo.writeDocument(reqJson)
旁边,也不会打印valid
字符串。
def validateJson = Action(parse.json) {
request => {
val logger = LoggerFactory.getLogger("superman")
val jsonSchema = Source.fromFile(play.api.Play.getFile("conf/schema.json")).getLines.mkString
val reqJson: JsValue = request.body
val GUID = (reqJson \ "guid").get
val result: VA[JsValue] = SchemaValidator.validate(Json.fromJson[SchemaType](
Json.parse(jsonSchema.stripMargin)).get, reqJson)
result.fold(
invalid = { errors =>
var violatesList = List[String]()
var invalidError = Map("GUID" -> GUID.toString(), "status" -> "error", "description" -> "Invalid Request Received")
for (msg <- (errors.toJson \\ "msgs"))
violatesList = (msg(0).get).toString() :: violatesList
invalidError += ("violations" -> (violatesList.toString()))
val errorResponse = Json.toJson(invalidError)
logger.error("Event=Bad Request Received, Reason=Invalid Json, Response=" + errorResponse)
println("invalid")
BadRequest(errorResponse)
},
valid = {
println("valid")
mongo.writeDocument(reqJson)
val successResponse = Json.obj("GUID" -> GUID.toString, "status" -> "OK", "message" -> ("Valid Request Received"))
logger.info("Event=Valid Request Received, Response=" + successResponse)
post => Ok(successResponse)
}
)
}
}
在检查了更多文档之后,我发现post =>
应该在valid = {
函数旁边,就像这样:
valid = {
post =>
println("valid")
mongo.writeDocument(reqJson)
val successResponse = Json.obj("GUID" -> GUID.toString, "status" -> "OK", "message" -> ("Valid Request Received"))
logger.info("Event=Valid Request Received, Response=" + successResponse)
Ok(successResponse)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.