Как сделать общие методы для нескольких классов (Java, Spring)? - PullRequest
0 голосов
/ 29 января 2020

У меня есть два метода в моих контроллерах, которые я должен вставить в каждый контроллер. Код этих методов изменяется в зависимости от контроллера.

Например, у меня есть:

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;

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