package ru.kirillius.XCP.Persistence; import tools.jackson.core.JacksonException; import tools.jackson.core.JsonParser; import tools.jackson.databind.DeserializationContext; import tools.jackson.databind.deser.std.StdDeserializer; import java.util.UUID; public class EntityReferenceDeserializer extends StdDeserializer { private final RepositoryServiceImpl repositoryService; public EntityReferenceDeserializer(RepositoryServiceImpl repositoryService) { super(EntityReference.class); this.repositoryService = repositoryService; } @Override public EntityReference deserialize(JsonParser p, DeserializationContext ctxt) throws JacksonException { var node = ctxt.readTree(p); var type = node.get("type").asString(); var id = node.get("id").asLong(); var uuid = node.get("uuid").asString(); try { @SuppressWarnings("unchecked") var repository = repositoryService.getRepositoryForEntity((Class) Class.forName(type)); if (uuid != null) { return new EntityReference(repository.get(UUID.fromString(uuid))); } return new EntityReference(repository.get(id)); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } }