Как вывести на экран через Swagger методы service-классов?

Пишу простое web-приложение. Со Spring boot и Swagger знаком недавно. Использую Spring-MVC, соответственно, имеются: pojo-класс Admin(model), класс-контроллер AdminController(controller), и AdminService(всю логику пишу туда). Так же интерфейс AdminRepository(repository). В проекте уже есть Swagger. В классе-контроллере имеются REST-запросы, и Swagger мне без проблем это отображает. Но дело в том, что в AdminService я прописал новые методы, и мне хочется их как-то отобразить, как например, методы для REST-запросов. Как я могу это сделать? Я слышал, что можно методы из servic-а через controller можно запустить.

Admin:

package com.tinychiefdelights.model;

import lombok.Data;

import javax.persistence.*;

@Data
@Entity
@Table(name = "pg_user", schema = "public")
public class Admin {

    public Admin() { // Пустой конструктор для Hibernate

    }

    // Поля

    // name, lastName, login, password берем от класса User через связи;

    private @Id
    @GeneratedValue
    Long id;


    // Relationships
    //
    @OneToOne
    @JoinColumn(name = "id") // Join without Admin in User class
    private User user;

}

AdminController:

package com.tinychiefdelights.controller;

import com.tinychiefdelights.exceptions.NotFoundException;
import com.tinychiefdelights.model.Admin;
import com.tinychiefdelights.repository.AdminRepository;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Api(value = "Работа с Админом", tags = {"Администратор"})
@RestController
public class AdminController {

    private final AdminRepository adminRepository;

    @Autowired
    public AdminController(AdminRepository adminRepository) {
        this.adminRepository = adminRepository;
    }

    // Aggregate Root
    @GetMapping("/admins")
    List<Admin> all(){ // Ищем в базе только тех, у кого ENUM == role
        return adminRepository.findByUserRole("admin");
    }

    @PostMapping("/admins")
    Admin newAdmin(@RequestBody Admin newAdmin){
        return adminRepository.save(newAdmin);
    }

    //Single Item
    @GetMapping("/admins/{id}")
    Admin one(@PathVariable Long id) {
        return adminRepository.findById(id)
                .orElseThrow(() -> new NotFoundException(id));
    }

    @PutMapping("/admins/{id}")
    Admin replaceAdmin(@RequestBody Admin newAdmin, @PathVariable Long id){
        return adminRepository.findById(id)
                .map(admin -> {
                    admin.setUser(newAdmin.getUser());
                    return adminRepository.save(admin);
                })
                .orElseGet(() -> {
                    newAdmin.setId(id);
                    return adminRepository.save(newAdmin);
                });
    }

    @DeleteMapping("/admins/{id}")
    void deleteAdmins(@PathVariable Long id){
        adminRepository.deleteById(id);
    }


}

AdminService:

package com.tinychiefdelights.service;

import com.tinychiefdelights.model.Cook;
import com.tinychiefdelights.model.Order;
import com.tinychiefdelights.repository.AdminRepository;
import com.tinychiefdelights.repository.CookRepository;
import com.tinychiefdelights.repository.OrderRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AdminService extends UserService {

    // Поля
    //
    private AdminRepository adminRepository; // Администратор

    private OrderRepository orderRepository; // Заказ

    private CookRepository cookRepository; // Повар


    // Getters and Setters
    // Делаем inject через сеттеры
    @Autowired
    public void setAdminRepository(AdminRepository adminRepository) {
        this.adminRepository = adminRepository;
    }

    @Autowired
    public void setOrderRepository(OrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    @Autowired
    public void setCookRepository(CookRepository cookRepository) {
        this.cookRepository = cookRepository;
    }


    // Методы
    //
    public List<Order> getAllOrders(){ // Вывод списка всех заказов
        return orderRepository.findAll();
    }

    public Order getOrderInfo(Long id){ // Вывод информации по конкретному заказу
        return orderRepository.getById(id);
    }

    public void removeCook(Long id){ // Удалить повара
        cookRepository.deleteById(cookRepository.getCookById(id));
    }

    public void editCook(){ // Изменить карту повара

    }

}

AdminRepo:

package com.tinychiefdelights.repository;

import com.tinychiefdelights.model.Admin;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface AdminRepository extends JpaRepository<Admin, Long> { // Интерфейс для репозитория Admin

    List<Admin> findByUserRole(String role); // Фильтр из БД для Администратора

}

введите сюда описание изображения

Spring MVC + Hibernate + Jpa + PosgreSQL + Swagger;


Ответы (1 шт):

Автор решения: Artur Vartanyan

И так, для начало необходимо прописать метод в классе AdminService, затем расписать тело метода, например:

public Order getOrderInfo(Long id){ // Вывод информации по конкретному заказу
        return orderRepository.getById(id);
    }

Затем мы идем в класс CookController и используя DI этот метод "перекидываем" туда:

    @GetMapping("admin/orders/{id}")
    Order getOrderInfo(@PathVariable Long id){ // Вывод информации по конкретному заказу
        return adminService.getOrderInfo(id);
    }

Ну а при запуске приложения Swagger выведет на экран как обычный метод, который можно и протестить.

→ Ссылка