Я занимаюсь разработкой сервис-ориентированной платформы для извлечения, создания и обновления сущностей из БД.Дело в том, что каждая отдельная сущность Java расширяет AbstractEntity
, поэтому, например, у меня есть
MyCar extends AbstractEntity implements Serializable
У этого AbstractEntity
есть общие поля (такие как id или контрольные).Итак, я уже разработал GenericReadService
, который, получив имя класса и parameterMap , может читать любую сущность и создает EntityActionResult<T>
, включая List<T extends AbstractEntity>
.
Моя проблема возникает при попытке преобразовать этот тип T
во что-то вроде <K extends GenericDTO>
, так как запрашивающий клиент не знает AbstractEntity
(очевидно), а только GenericDTO
.Делая это для безопасности и модульности.
Итак, теперь я застрял в преобразовании ListResponse<T>
в ReturnList<K extends GenericDTO>
, так как я не нахожу способ узнать, какой класс K
должен применятьсядля каждого T
.
Вот что я на самом деле написал:
private GenericEntityActionResult transform (EntityActionResult result) {
AsnGenericEntityActionResult r = new AsnGenericEntityActionResult();
if (result.getCode() == EntityActionResult.Code.ENTITY || result.getCode() == EntityActionResult.Code.ENTITY_LIST ) {
r.setCode(AsnGenericEntityActionResult.Code.OK);
List <? extends GenericDTO> list = new ArrayList<>();
if (result.getEntity() != null) {
//transform this entity into DTO
//<b>SOMETHING LIKE list.add(result.getEntity());</b>
} else if (result.getList() != null && !result.getList().isEmpty()) {
for (AbstractEntity a:result.getList()) {
//transform this entity into DTO
//<b>SOMETHING LIKE list.add(result.getEntity());</b>
//list.add(result.getEntity());
}
}
r.setList(list);
}
return r;
Я, очевидно, застрял в ЧЕМ-ТО, КАК, но не могу найти подходящий способ сделать это.
Я думал о создании метода abstract <T extends GenericDTO> transformToDTO()
на AbstractEntity
, но не могу этого сделать, поскольку существует лотов (и я имею в виду сотни) сущностей, расширяющих AbstractEntity
иэтот подход клиент-сервис является новой разработкой для некоторых организаций, а не для всей системы.
Какие-нибудь умные идеи?