Reputation: 73
I see that the Jackson library is failing to serialize Scala enums, when the DefaultTyping is enabled with OBJECT_AND_NON_CONCRETE
setting. Please note that the serialization works fine when I use JAVA_LANG_OBJECT
setting.
I am seeing the below exception
[scalatest] com.fasterxml.jackson.databind.JsonMappingException: Type id handling not implemented for type scala.Enumeration$Val (by serializer of type com.fasterxml.jackson.module.scala.ser.EnumerationSerializer) (through reference chain: <MyType>)
[scalatest] at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:284)
[scalatest] at com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1110)
[scalatest] at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1135)
[scalatest] at com.fasterxml.jackson.databind.JsonSerializer.serializeWithType(JsonSerializer.java:160)
[scalatest] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:706)
[scalatest] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689)
[scalatest] at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:155)
[scalatest] at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
[scalatest] at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2509)
[scalatest] at com.fasterxml.jackson.core.base.GeneratorBase.writeObject(GeneratorBase.java:378)
Here is a sample code
object Day extends Enumeration {
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
case class Holiday(day: Day.Value)
val objectMapper = new ObjectMapper()
objectMapper.registerModule(DefaultScalaModule)
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false)
objectMapper.enableDefaultTyping(DefaultTyping.OBJECT_AND_NON_CONCRETE, JsonTypeInfo.As.PROPERTY)
I have tried using @JsonScalaEnumeration
as mentioned in https://github.com/FasterXML/jackson-module-scala/wiki/Enumerations , but doesn't seem to help.
Thanks in advance.
Upvotes: 2
Views: 1512
Reputation: 73
I got it working with a workaround like this
object Day extends Enumeration {
type Day = Value
//val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
case class Val(dayName: String) extends super.Val
val Mon = Val("Monday")
val Tue = Val("Tuesday")
val Sat = Val("Saturday")
val Sun = Val("Sunday")
}
class DayType extends TypeReference[Day.type]
case class Holidays(@JsonScalaEnumeration(classOf[DayType]) days: Day.Val)
Upvotes: 3