Closed
Description
I found problem that adding DefaultScalaModule to object mapper breaks Deserialization of classes that successfuly deserialized without scala module
package test;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.module.scala.DefaultScalaModule;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class ScalaModuleTest {
public record M(String name, String domain) {
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static M fromString(String uri) {
String[] parts = uri.split("@");
if (parts.length > 2 || parts.length == 0) {
throw new RuntimeException(String.format("Invalid SIP URI: %s", uri));
}
String[] usernameParts = parts[0].split("\\.");
return new M(usernameParts[usernameParts.length - 1], parts.length == 2 ? parts[1] : null);
}
@Override
@JsonValue
public String toString() {
return String.format("%s@%s", name, domain);
}
}
public record Obj(M val) {
}
@Test
public void testScalaModule() throws JsonProcessingException {
var json = "{\"val\": \"a@b\"}";
var mapper = new ObjectMapper().registerModule(new DefaultScalaModule());
var val = mapper.readValue(json, Obj.class);
Assertions.assertEquals(new M("a", "b"), val.val);
}
}
Metadata
Metadata
Assignees
Labels
No labels