Я определяю свой springboot api с помощью Swagger, и как я могу использовать его в других модулях для реализации контроллера?

#spring #spring-boot #swagger #swagger-ui #java

#spring #spring-boot #swagger #swagger-ui #java

Вопрос:

Ниже приведен скриншот структуры моего проекта. Модуль spring-boot-stub — это api, и я хочу использовать его на сервере модулей, который является приложением spring boot.

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

API генерируется Swagger, и один из api выглядит следующим образом:

ProductsApi.class:

 import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.wondergate.polaris.model.Product;
import java.util.List;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Api(
    value = "products",
    description = "the products API"
)
public interface ProductsApi {
    @ApiOperation(
        value = "",
        notes = "Get the list of products",
        response = Product.class,
        responseContainer = "List",
        tags = {}
    )
    @ApiResponses({        @ApiResponse(
            code = 200,
            message = "OK",
            response = Product.class
        )})
    @RequestMapping(
        value = {"/products"},
        produces = {"application/json"},
        consumes = {"application/json"},
        method = {RequestMethod.GET}
    )
    ResponseEntity<List<Product>> getProducts();
}  

Я реализую api в модуле server следующим образом:

 import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

import io.wondergate.polaris.api.ProductsApi;
import io.wondergate.polaris.model.Product;
import io.wondergate.polaris.server.dao.ProductDao;
import io.wondergate.polaris.server.dao.ResourceInfoDao;
import io.wondergate.polaris.server.model.ResourceInfo;
import io.wondergate.polaris.server.model.ServerProduct;
import io.wondergate.polaris.server.utils.Convertor;

@Controller
public class ProductController implements ProductsApi {

    @Autowired
    private ProductDao productDao;
    @Autowired
    private ResourceInfoDao resourceInfoDao;

    @RequestMapping("/")
    @ResponseBody
    public String index() {
        return "Greetings from Spring Boot!";
    }

//    @RequestMapping("/products")
    public ResponseEntity<List<Product>> getProducts() {
        List<Product> productList = new ArrayList<Product>();
        Iterable<ServerProduct> allProducts = productDao.findAll();
        for (ServerProduct serverProduct : allProducts) {
            Iterable<ResourceInfo> resourceInfo = resourceInfoDao.findByProductId(serverProduct.getId());
            Product product = Convertor.serverProductToProduct(serverProduct, resourceInfo);
            productList.add(product);
        }
        ResponseEntity<List<Product>> res = new ResponseEntity<List<Product>>(productList, HttpStatus.OK);
        return res;
    }

}  

Однако, хотя проект может быть успешно скомпилирован и запущен, он не может отображать URL-маршруты так, как я хочу, например

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

Итак, как я могу это сделать? Я хочу сделать модуль определения api и модуль реализации отдельными, чтобы при изменении определения api мне не нужно было изменять его реализацию (например, маршрут URL).

Комментарии:

1. @RequestMapping Spring считывается во время создания контекста в конкретном классе, поэтому, строго говоря, он не знает о своем интерфейсе. Грязным обходным путем было бы добавление его в impl (как вы прокомментировали) и ссылка значения (ов) на статическое поле в интерфейсе.

Ответ №1:

Я сожалею об этом вопросе. На самом деле проект может отображать URL-маршруты правильным образом. Истинной причиной вышеупомянутой проблемы является несоответствие типа контента.