加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在我的Play2 scala应用程序中执行json读取和写入时排除值

发布时间:2020-12-16 18:28:04 所属栏目:安全 来源:网络整理
导读:我在浏览: http://www.playframework.com/documentation/2.1.1/ScalaJsonCombinators和搜索 用于在执行读写操作时如何排除值.它可能在那里,但我不能 找到它. 所以,假设我有一个案例类预订,有一堆参数,一个creationTime和bookingId.当从对象写入Json时,我想
我在浏览:
http://www.playframework.com/documentation/2.1.1/ScalaJsonCombinators和搜索
用于在执行读写操作时如何排除值.它可能在那里,但我不能
找到它.

所以,假设我有一个案例类预订,有一堆参数,一个creationTime和bookingId.当从对象写入Json时,我想编写所有参数但是当从Json读取对象时,例如当在我的控制器中创建POST时:

def createBooking = Action(parse.json) {
    implicit request => {
      request.body.validate[Booking].map {
        case (booking) => {
          Logger.info("" + booking)
          Ok("ONLY TEST")
        }
      }.recoverTotal {
        e => BadRequest("Detected error:" + JsError.toFlatJson(e))
      }
    }
  }

我不想在Json POST中提供值creationTime和bookingId,我不想用我的Reads impl读取值:

package models.booking

import java.util.UUID
import org.joda.time.{DateTime}
import play.api.libs.functional.syntax._
import play.api.libs.json._

case class Booking (bookingId: UUID,rId: Long,creationTime: DateTime,user: User,dateTime: BookingTime,numOfGuest: Int,status: BookingState.BookingState) {

  def accepted(): Booking = {
    this.copy(status = BookingState.ACCEPTED)
  }

  def sent(): Booking = {
    this.copy(status = BookingState.SENT)
  }

  def denied(): Booking = {
    this.copy(status = BookingState.DENIED)
  }

  def denyWithNewTimeSuggestion(): Booking = {
    this.copy(status = BookingState.DENIED_NEW_TIME_SUGGESTED)
  }

  def timeout(): Booking = {
    this.copy(status = BookingState.TIMED_OUT)
  }

  def sendOnOpening(): Booking = {
    this.copy(status = BookingState.ON_HOLD)
  }
}

object Booking {

  implicit object UUIDFormat extends Format[UUID] {
    def writes(uuid: UUID): JsValue = JsString(uuid.toString())
    def reads(json: JsValue): JsResult[UUID] = json match {
      case JsString(x) => JsSuccess(UUID.fromString(x))
      case _ => JsError("Expected UUID as JsString")
    }
  }

  val pattern = "yyyy-M-dd"
  implicit val dateFormat =
    Format[DateTime](Reads.jodaDateReads(pattern),Writes.jodaDateWrites(pattern))

  import utils.EnumUtils.enumReads
  implicit val bookingStateReads = enumReads(BookingState)

  import play.api.libs.json.Reads._
  implicit val bookingReads: Reads[Booking] = (
    (__  "bookingId").read[UUID] and
      (__  "rId").read[Long] and
      (__  "creationTime").read[DateTime] and
      (__  "user").read[User] and
      (__  "dateTime").read[BookingTime] and
      (__  "numOfGuest").read[Int] and
      (__  "status").read[BookingState.BookingState]
    )(Booking.apply _)

  import utils.EnumUtils.enumWrites

  import play.api.libs.json.Writes._
  implicit val bookingWrites: Writes[Booking] = (
    (__  "bookingId").write[UUID] and
      (__  "rId").write[Long] and
      (__  "creationTime").write[DateTime] and
      (__  "user").write[User] and
      (__  "dateTime").write[BookingTime] and
      (__  "numOfGuest").write[Int] and
      (__  "status").write[BookingState.BookingState]
    )(unlift(Booking.unapply))
}

object BookingState extends Enumeration {
  type BookingState = Value
  val NEW = Value("NEW")
  val SENT = Value("SENT")
  val ACCEPTED = Value("ACCEPTED")
  val DENIED = Value("DENIED")
  val DENIED_NEW_TIME_SUGGESTED = Value("DENIED_NEW_TIME_SUGGESTED")
  val TIMED_OUT = Value("TIMED_OUT")
  val ON_HOLD = Value("ON_HOLD")
}

如何指定排除值bookingId和creationTime的customBookingReads.
我还想保留原来的’bookingReads’,以便我可以将其用于其他事情.

解决方法

经过一番深思熟虑,我意识到在这种情况下,预订和请求实际上是两个不同的东西,因此我不应该尝试将这两个混合起来.

我创建了一个BookingRequest,可以从中创建预订.

预约申请:

case class BookingRequest(rId: Long,bookingTime: BookingTime,numOfGuest: Int) {

  def createBooking(): Booking = {
    Booking(UUID.randomUUID(),this.rId,new DateTime(),this.user,this.bookingTime,this.numOfGuest,BookingState.NEW)
  }    
}

object BookingRequest {

  import play.api.libs.json.Reads._
  implicit val bookingRequestReads: Reads[BookingRequest] = (
    (__  "rId").read[Long] and
      (__  "user").read[User] and
      (__  "bookingTime").read[BookingTime] and
      (__  "numOfGuest").read[Int]
    )(BookingRequest.apply _)

  import play.api.libs.json.Writes._
  implicit val bookingRequestWrites: Writes[BookingRequest] = (
    (__  "rId").write[Long] and
      (__  "user").write[User] and
      (__  "bookingTime").write[BookingTime] and
      (__  "numOfGuest").write[Int]
    )(unlift(BookingRequest.unapply))    
}

控制器:

def createBooking = Action(parse.json) {
    implicit request => {
      request.body.validate[BookingRequest].map {
        case (bookingRequest) => {
          Logger.info("Booking" + bookingRequest)
          Logger.info("BookingRequest" + bookingRequest.createBooking())
          // SAVE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
          Ok(Json.obj("status" -> "OK"))
        }
      }.recoverTotal {
        e =>  BadRequest(Json.obj("status" ->"KO","message" -> JsError.toFlatJson(e)))
      }
    }
  }

但我仍然很好奇如何在执行读取和写入时排除值

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读