У меня есть два метода в моих контроллерах, которые я должен вставить в каждый контроллер. Код этих методов изменяется в зависимости от контроллера.
Например, у меня есть:
private T1 variantDTO(Variant variant, T2 entity) {
if (variant == null) variant = Variant.DEFAULT;
switch (variant) {
case ID:
return T3.toIdDTO(entity);
default:
return T3.toDTO(entity);
}
}
private List<? extends T1> variantDTOList(Variant variant, List<T2> entityList) {
if (variant == null) variant = Variant.DEFAULT;
switch (variant) {
case ID:
return T3.toIdDTOList(entityList);
default:
return T3.toDTOList(entityList);
}
}
T1, T2, T3 должны быть изменены в каждом контроллере.
T3 - это поле с автоматическим подключением.
Например:
@Autowired
EntityMapper entityMapper;
А затем:
//...
case ID:
return entityMapper.toIdDTOList(entityList);
//...
Я не могу понять, как это сделать.
Вы можете помочь мне? Что мне делать? Когда я хочу изменить эти методы, я должен сделать это в нескольких контроллерах. Это очень сложно.
ОБНОВЛЕНИЕ:
Я пытаюсь создать общий класс параметризации c с этими методами, которые я хочу наследовать в моих контроллерах. Но я получаю ошибки в методах (toIdDTO, toDTO, ...)
public class VariantController<Abstract, Entity, Mapper> {
@Autowired
Mapper mapper;
private Abstract variantDTO(Variant variant, Entity entity) {
if (variant == null) variant = Variant.DEFAULT;
switch (variant) {
case ID:
return mapper.toIdDTO(entity);
default:
return mapper.toDTO(entity);
}
}
private List<? extends Abstract> variantDTOList(Variant variant, List<Entity> entityList) {
if (variant == null) variant = Variant.DEFAULT;
switch (variant) {
case ID:
return mapper.toIdDTOList(entityList);
default:
return mapper.toDTOList(entityList);
}
}
}
Например:
Не удается разрешить метод toIdDTO (entity)
UPDATE2 :
У меня в каждом контроллере по-разному.
UPDATE3 - Полный пример:
Контроллер:
@RestController
@RequestMapping("/api/groupsparameters")
public class GroupParametersController {
@Autowired
private GroupParameterService groupParameterService;
@Autowired
private GroupParameterMapper groupParameterMapper;
@GetMapping("/{id}")
public ResponseEntity<? extends GroupParameterAbstract> get(@PathVariable Long id,
@RequestParam(value = "variant", required = false) Variant variant) throws EntityNotFoundException {
GroupParameter groupParameter = groupParameterService.findById(id);
return new ResponseEntity<>(variantDTO(variant, groupParameter), HttpStatus.OK);
}
@GetMapping
public ResponseEntity<List<? extends GroupParameterAbstract>> findAll(@RequestParam(value = "variant", required = false) Variant variant,
@RequestParam(value = "search", required = false) String search) {
List<GroupParameter> groupParameterList = groupParameterService.findAll();
return new ResponseEntity<>(variantDTOList(variant, groupParameterList), HttpStatus.OK);
}
private GroupParameterAbstract variantDTO(Variant variant, GroupParameter entity) {
if (variant == null) variant = Variant.DEFAULT;
switch (variant) {
case ID:
return groupParameterMapper.toIdDTO(entity);
default:
return groupParameterMapper.toDTO(entity);
}
}
private List<? extends GroupParameterAbstract> variantDTOList(Variant variant, List<GroupParameter> entityList) {
if (variant == null) variant = Variant.DEFAULT;
switch (variant) {
case ID:
return groupParameterMapper.toIdDTOList(entityList);
default:
return groupParameterMapper.toDTOList(entityList);
}
}
}
Mapper:
@Mapper(componentModel = "spring", uses = { TypeReportService.class})
public interface GroupParameterMapper {
//GroupParatemerDTO
GroupParameterDTO toDTO(GroupParameter groupParameter);
List<GroupParameterDTO> toDTOList(List<GroupParameter> groupParameterList);
//GroupParameterIdDTO
@Mapping(target = "typeReportId", source = "typeReport.id")
GroupParameterIdDTO toIdDTO(GroupParameter groupParameter);
List<GroupParameterIdDTO> toIdDTOList(List<GroupParameter> groupParameterList);
@Mapping(target = "id", ignore = true)
@Mapping(target = "typeReport", source ="typeReportId", qualifiedByName = { "findTypeReportById" })
GroupParameter fromIdDTO(GroupParameterIdDTO groupParameterIdDTO) throws EntityNotFoundException;
//GroupParameter
@Mapping(target = "id", ignore = true)
@Mapping(target = "common", ignore = true)
@BeanMapping(nullValuePropertyMappingStrategy = IGNORE)
void fill(GroupParameter source, @MappingTarget GroupParameter target);
}
Объект:
@Entity
@Data
public class GroupParameter {
@Id
@GeneratedValue(generator = ID_GENERATOR)
private Long id;
private String title;
private boolean common;
@ManyToOne
@JoinColumn(name = "TYPE_REPORT_ID", nullable = false)
private TypeReport typeReport;
}
DTO:
@Data
public abstract class GroupParameterAbstract {
private Long id;
private String title;
private boolean common;
}
public class GroupParameterDTO extends GroupParameterAbstract {
}
@Data
public class GroupParameterIdDTO extends GroupParameterAbstract {
private Long typeReportId;
}