Джексон не десериализует объект через универсальный тип - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь использовать общий уровень служб и уровень хранилища для извлечения объектов через RestTemplate из серверной службы, которая, как мне известно, сериализует полезные нагрузки для правильного типа Event.

Вот класс Event:

@Data
@Entity
@Table(name = "event")
@NoArgsConstructor
@AllArgsConstructor
public class Event extends BaseEntity {

    @Column(name = "entity_id")
    private long entityId;

    @Column(name = "entity_type")
    private String entityType;

    @Column(name = "type")
    private String type;
}

и ViewCommand<T> класс:

@Getter
@Setter
@NoArgsConstructor
public class ViewCommand<T extends BaseEntity> {
    private List<T> results;
}

Фронтенд-сервис, использующий Spring Boot MVC для обслуживания представлений через Controller -> Service -> Repository, который отправляет запросы в бэкэнд-сервис, используя RestTemplate.

Вот контроллер:

@Controller
public class EventController extends BaseController {

    private static final String PREFIX = "events";

    @Autowired
    private GenericService<Event> genericService;

    @GetMapping(PREFIX + "/{page}")
    public String events(final Model model) {
        ViewCommand<Event> command = genericService.list(PREFIX, Event.class.getName(), 0);
        model.addAttribute("command", command);
        return "events";
    }
}

Общий класс обслуживания:

@Service
public class GenericService<T extends BaseEntity> {

    @Autowired
    private GenericRepository<T> genericRepository;

    public ViewCommand<T> list(String prefix, String className, int page) {
        return genericRepository.list(new ParameterizedTypeReference<>() {}, prefix, className, page);
    }
}

Общий класс репозитория:

@Repository
public class GenericRepository<T extends BaseEntity> extends BaseRepository {
    private static final String LIST = "%s/list/%s/%s";

    @Value("${backend.uri}")
    private String backendUri;

    @Autowired
    private RestTemplate template;

    public ViewCommand<T> list(ParameterizedTypeReference<ViewCommand<T>> responseType, String prefix, String type, int page) {
        ViewCommand<T> body = template.exchange(backendUri + format(LIST, prefix, type, page), GET, getEntity(), responseType).getBody();
        return body;
    }
}

Может кто-нибудь сказать, почему список results в ViewCommand<T> опустошен до списка BaseEntity, а не Event?

Где я ошибаюсь, что Java не принимает тип T при использовании ParameterizedTypeReference?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...