我有一个控制器
def getCars(notation: Option[Boolean] = Some(false)) = identified.auth(hasOceanScope).async { implicit request =>
carService.getCars().map {
case Seq() => Response.NotFound
case cars => Response.Ok(cars)
}
}
Car Case类如下所示:
case class Car(
name: String,
createdAt: LocalDateTimeOffset,
wheels: Seq[Wheel]
)
object Car{
implicit val wheelFormat = Wheel.format
implicit def toOffset(date: LocalDateTime): LocalDateTimeOffset = LocalDateTimeOffset.apply(date)
implicit val format = Json.format[Car]
case class Wheel(
name: String,
createdAt: LocalDateTimeOffset
)
object Wheel{
implicit val format = Json.format[Wheel]
implicit def toOffset(date: LocalDateTime): LocalDateTimeWithOffset = LocalDateTimeWithOffset.apply(date)
)
当记号查询参数为真时->要返回带记号的CreatedAt Car对象和车轮对象字段=>2022-10-22T00:00:00#1当记号查询参数为FALSE->要返回不带记号的CreatedAt Car对象和车轮对象字段=>2022-10-22T00:00:00
这就是为什么我在LocalDateTimeOffset对象中创建了两种格式
case class LocalDateTimeWithOffset(dt: LocalDateTime, offset: Int) {
val localDateTimeWithOffsetReads: Reads[LocalDateTimeWithOffset] = Reads.of[String].flatMap {
str => if (str.contains("#")) {
val (dt, offset) = str.splitAt(str.indexOf("#"))
Reads.pure(LocalDateTimeWithOffset(LocalDateTime.parse(dt), offset.drop(1).toInt))
} else {
Reads.pure(LocalDateTimeWithOffset(LocalDateTime.parse(str), 1))
}
}
val localDateTimeWithOffsetWrites: Writes[LocalDateTimeWithOffset] = new Writes[LocalDateTimeWithOffset] {
override def writes(a: LocalDateTimeWithOffset): JsValue = JsString(a.dt.format(dateTimeUTCFormatter) + s"#${a.offset}")
}
val localDateTimeWithOffsetWritesOff: Writes[LocalDateTimeWithOffset] = new Writes[LocalDateTimeWithOffset] {
override def writes(a: LocalDateTimeWithOffset): JsValue = JsString(a.dt.format(dateTimeUTCFormatter))
}
val localDateTimeWithoutOffsetFormat: Format[LocalDateTimeWithOffset] = Format(localDateTimeWithOffsetReads, localDateTimeWithOffsetWritesOff)
val localDateTimeWithOffsetFormat: Format[LocalDateTimeWithOffset] = Format(localDateTimeWithOffsetReads, localDateTimeWithOffsetWrites)
implicit var format: Format[LocalDateTimeWithOffset] = localDateTimeWithoutOffsetFormat
}
但是如何根据符号查询参数值从控制器使用两种不同的格式呢?
1条答案
按热度按时间jdgnovmf1#
好的,看看问题的标题,
changing implicit value
不是Scala开发人员要做的事情,因为编译器负责查找隐含的值,而您肯定希望避免ambiguous implicits found
错误。相反,您会看到开发人员使用所谓的type class instance constructor
或类似的东西。这就是它的工作原理在你的情况下:假设您有一个类
A
,它可以通过多种方式与Json相互格式化:然后,给定一个类
B
,其中有一个A
类型的示例变量,您可以使用type class instance constructor
:问题是,除非在控制器层中,否则您可能不会关心序列化,所以在控制器层中,您可以: