Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Java > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 18.03.2020, 21:34   #1
KenesK
Пользователь
 
Регистрация: 28.11.2013
Сообщений: 12
По умолчанию Дженерикс

Столкнулся с проблемой абстрагирования, есть сервис на данный момент реализовано так, имеется сущность ProjectEntity (справочник проектов) и его методы реализованы в DirectoryController, всё прекрасно работало пока мне не пришлось добавлять в функционал еще один справочник задач (TaskEntity). Я конечно могу так же добавлять методы для нового справочника и всё будет работать, но у двух справочников одни и те же CRUD операции, и получится дублирование кода, что не есть хорошо. Подскажите как реализовать методы 2х сущностей в одном контроллере, имею представление о том что нужно все абстрагировать, но реализация не понятна. Всем заранее спасибо, и здоровья
Код:
package com.dilau.tsservice.controller;

import com.dilau.tsservice.dto.ProjectDto;
import com.dilau.tsservice.entity.ProjectEntity;
import com.dilau.tsservice.exception.ResourceNotFoundException;
import com.dilau.tsservice.repos.ProjectRepo;
import com.dilau.tsservice.repos.TaskRepo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.modelmapper.ModelMapper;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;


@RestController
@Slf4j
@RequestMapping("/project")
@RequiredArgsConstructor
public class DirectoryController {

    private final ModelMapper modelMapper;
    private final ProjectRepo projectRepo;
    private final TaskRepo taskRepo;

    @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
    public List<ProjectDto> getAllProject() {
        List<ProjectEntity> lists = (List<ProjectEntity>) projectRepo.findAll();
        return lists.stream().map(this::toDto).collect(Collectors.toList());
    }

    @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
    public ProjectDto getProjectById(@PathVariable(value = "id") Long id) {
        return toDto(projectRepo.findById(id)
                  .orElseThrow(() -> new ResourceNotFoundException("Project", "id", id)));
    }

    @PostMapping(value = "/addProject", consumes = MediaType.APPLICATION_JSON_VALUE, produces =
            MediaType.APPLICATION_JSON_VALUE)
    public void createProject(@RequestBody ProjectDto projectDto) {
        ProjectEntity projectEntity = toEntity(projectDto);
        ProjectEntity projectEntity1 = projectRepo.save(projectEntity);
    }

    @PostMapping(value = "/updateProject/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces =
            MediaType.APPLICATION_JSON_VALUE)
    public void updateProject(@PathVariable(value = "id") Long id, @Valid @RequestBody ProjectDto projectDetail) {
        ProjectDto projectDto = toDto(projectRepo.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("Project", "id", id)));
        projectDto.setId(projectDetail.getId());
        projectDto.setCode(projectDetail.getCode());
        projectDto.setValueKz(projectDetail.getValueKz());
        projectDto.setValueRu(projectDetail.getValueRu());
        ProjectEntity projectEntity = toEntity(projectDto);
        projectRepo.save(projectEntity);

    }

    @DeleteMapping(value = "/deleteProject/{id}", produces =
            MediaType.APPLICATION_JSON_VALUE)
    public void deleteProject(@PathVariable(value = "id") Long id) {
        ProjectDto projectDto = toDto(projectRepo.findById(id)
                .orElseThrow(() -> new ResourceNotFoundException("Project", "id", id)));
        ProjectEntity projectEntity = toEntity(projectDto);
        projectRepo.delete(projectEntity);
    }

    private ProjectEntity toEntity(ProjectDto projectDto) {
        return modelMapper.map(projectDto, ProjectEntity.class);
    }

    private ProjectDto toDto(ProjectEntity projectEntity) {
        return modelMapper.map(projectEntity, ProjectDto.class);
    }


}
Код:
package com.dilau.tsservice.dto;


import lombok.Data;

@Data
public class ProjectDto {

    private Long id;
    private String code;
    private String valueKz;
    private String valueRu;
}
Код:
package com.dilau.tsservice.dto;

import lombok.Data;

@Data
public class TaskDto {

    private Long id;
    private String code;
    private String valueKz;
    private String valueRu;

}
Код:
package com.dilau.tsservice.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.util.List;


@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "project")
public class ProjectEntity {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;

    @NotBlank
    @Column(name = "code", nullable = false)
    private String code;

    @NotBlank
    @Column(name = "value_kz", nullable = false)
    private String valueKz;

    @NotBlank
    @Column(name = "value_ru", nullable = false)
    private String valueRu;

    @OneToMany(mappedBy = "projectEntity")
    //@JsonBackReference
    private List<DashBoardEntity> dashBoardEntityList;

}
Код:
package com.dilau.tsservice.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.util.List;


@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "task")
public class TaskEntity {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;

    @NotBlank
    @Column(name = "code", nullable = false)
    private String code;

    @NotBlank
    @Column(name = "value_kz", nullable = false)
    private String valueKz;

    @NotBlank
    @Column(name = "value_ru", nullable = false)
    private String valueRu;

    @OneToMany(mappedBy = "taskEntity")
    //@JsonBackReference
    private List<DashBoardEntity> dashBoardEntityList;
}

Последний раз редактировалось KenesK; 18.03.2020 в 21:36.
KenesK вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы



Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS