Source:
public Module customizeTaskModelObjectMapper() { SimpleModule module = new SimpleModule("mapTaskRuntimeInterfaces", Version.unknownVersion()); SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver() { @Override public JavaType resolveAbstractType(DeserializationConfig config, BeanDescription typeDesc) { return findTypeMapping(config, typeDesc.getType()); } }; resolver.addMapping(Task.class, TaskImpl.class); resolver.addMapping(TaskCandidateUser.class, TaskCandidateUserImpl.class); resolver.addMapping(TaskCandidateGroup.class, TaskCandidateGroupImpl.class); resolver.addMapping(Result.class, TaskResult.class); module.setMixInAnnotation(Result.class, TaskResultMixIn.class); module.setMixInAnnotation(Payload.class, TaskPayloadMixIn.class); module.registerSubtypes(new NamedType(TaskResult.class, TaskResult.class.getName())); module.registerSubtypes(new NamedType(ClaimTaskPayload.class, ClaimTaskPayload.class.getName())); module.registerSubtypes(new NamedType(CompleteTaskPayload.class, CompleteTaskPayload.class.getName())); module.registerSubtypes(new NamedType(CreateTaskPayload.class, CreateTaskPayload.class.getName())); module.registerSubtypes(new NamedType(DeleteTaskPayload.class, DeleteTaskPayload.class.getName())); module.registerSubtypes(new NamedType(GetTasksPayload.class, GetTasksPayload.class.getName())); module.registerSubtypes(new NamedType(GetTaskVariablesPayload.class, GetTaskVariablesPayload.class.getName())); module.registerSubtypes(new NamedType(ReleaseTaskPayload.class, ReleaseTaskPayload.class.getName())); module.registerSubtypes(new NamedType(SetTaskVariablesPayload.class, SetTaskVariablesPayload.class.getName())); module.registerSubtypes(new NamedType(UpdateTaskPayload.class, UpdateTaskPayload.class.getName())); module.setAbstractTypes(resolver); return module; }

Target:
public Module customizeTaskModelObjectMapper() { SimpleModule module = new SimpleModule("mapTaskRuntimeInterfaces", Version.unknownVersion()); SimpleAbstractTypeResolver resolver = new SimpleAbstractTypeResolver() { @Override public JavaType resolveAbstractType(DeserializationConfig config, BeanDescription typeDesc) { return findTypeMapping(config, typeDesc.getType()); } }; resolver.addMapping(Task.class, TaskImpl.class); resolver.addMapping(TaskCandidateUser.class, TaskCandidateUserImpl.class); resolver.addMapping(TaskCandidateGroup.class, TaskCandidateGroupImpl.class); module.registerSubtypes(new NamedType(TaskResult.class, TaskResult.class.getSimpleName())); module.registerSubtypes(new NamedType(ClaimTaskPayload.class, ClaimTaskPayload.class.getSimpleName())); module.registerSubtypes(new NamedType(CompleteTaskPayload.class, CompleteTaskPayload.class.getSimpleName())); module.registerSubtypes(new NamedType(CreateTaskPayload.class, CreateTaskPayload.class.getSimpleName())); module.registerSubtypes(new NamedType(DeleteTaskPayload.class, DeleteTaskPayload.class.getSimpleName())); module.registerSubtypes(new NamedType(GetTasksPayload.class, GetTasksPayload.class.getSimpleName())); module.registerSubtypes(new NamedType(GetTaskVariablesPayload.class, GetTaskVariablesPayload.class.getSimpleName())); module.registerSubtypes(new NamedType(ReleaseTaskPayload.class, ReleaseTaskPayload.class.getSimpleName())); module.registerSubtypes(new NamedType(SetTaskVariablesPayload.class, SetTaskVariablesPayload.class.getSimpleName())); module.registerSubtypes(new NamedType(UpdateTaskPayload.class, UpdateTaskPayload.class.getSimpleName())); module.setAbstractTypes(resolver); return module; }