Я пытаюсь использовать общий уровень служб и уровень хранилища для извлечения объектов через 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
?