, но не работает, говоря, что конструктор по умолчанию отсутствует
Вы получаете ошибку, потому что нет конструктора по умолчанию или пустого, если хотите, конструктора для классов case. В этом конкретном случае, когда вы объявляете, что case class MyPOJO(createdBy : LocalDateTime)
scala компилятор сгенерирует что-то вроде (пример может быть не очень точным, я просто хочу показать идею):
class MyPOJO(createdBy : LocalDateTime) extends Product with Serializeble {
override def hashCode(): Int = ...
override def equals(oterh: Any): Boolean = ...
override def toString(): String = ...
// and other methods, like copy, unaply, tupled etc.
}
object MyPOJO {
def apply(createdBy : LocalDateTime) = new MyPOJO(createdBy)
}
, поэтому Джексон не сможет создать пустой экземпляр класса с пустыми полями (или точнее null
значениями), а затем ввести значения из источника JSON.
Что вы можете сделать - использовать обычный класс вместо case-классов. Или, что более предпочтительно, взглянуть на Scala дружественные JSON библиотеки, такие как Circe , которые не основаны на отражениях, в отличие от Джексона, и вместо этого генерируют JSON код c во время компиляции для некоторых классов, основанных на неявных макросах и Scala макросах (точнее, она опирается на библиотеку Shapeless
, которая использует механизм макросов Scala под капотом).
В вашем конкретном случае код будет выглядеть следующим образом:
import io.circe._
import io.circe.generic.auto._
import io.circe.syntax._
case class MyPOJO(createdBy: LocalDateTime)
val format = DateTimeFormatter.ofPattern("yyyy-MM-dd")
// Implement own `Encoder` to render `LocalDateTime` as JSON string, separated with comma inside
implicit val encoder: Encoder[LocalDateTime] = Encoder[String].contramap(_.format(format))
// Implement own `Decoder` to parse JSON string as `LocalDateTime`
implicit val decoder: Decoder[LocalDateTime] = Decoder[String].
emapTry(value => Try(LocalDate.parse(value, format).atStartOfDay()))
val foo = MyPOJO(LocalDateTime.now())
val json = foo.asJson
println(json.noSpaces)
println(json.as[MyPOJO])
, который даст следующий результат:
{"createdBy":"2020-03-04"}
Right(MyPOJO(2020-03-04T00:00))
Надеюсь, это поможет!