Как вывести на экран через 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 шт):
И так, для начало необходимо прописать метод в классе 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 выведет на экран как обычный метод, который можно и протестить.
