Как заставить Micronaut находить интерфейсы контроллера в наборе внешних источников - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть приложение для микронавтов, где я пытаюсь использовать openapi-generator для генерации заглушки моих контроллеров. Этот проект напрямую не поддерживает микронавтику, но он поддерживает определения jax-rs API , для которых есть поддержка микронавтов , поэтому я пытаюсь использовать их.

openapi-generator генерирует код в /generated/src/gen/java

TestAPI. java:

package com.owennewburn.generated.api;


import javax.ws.rs.*;
import javax.ws.rs.core.Response;

import io.swagger.annotations.*;

import java.io.InputStream;
import java.util.Map;
import java.util.List;
import javax.validation.constraints.*;
import javax.validation.Valid;

@Path("/test")
@Api(description = "the test API")
public interface TestApi {

    @GET
    @Produces({ "text/plain" })
    @ApiOperation(value = "Test \"Hello World\" endpoint", notes = "", tags={ "test" })
    @ApiResponses(value = { 
        @ApiResponse(code = 200, message = "success", response = String.class) })
    String helloWorld();
}

У меня есть приложение basi c в стандартном каталоге /src/main/kotlin, где я пытаюсь использовать этот интерфейс.

Application.kt:

package com.owennewburn.myapp

import io.micronaut.runtime.Micronaut

class Application: javax.ws.rs.core.Application() {

    fun main(args: Array<String>) {
        Micronaut.build()
            .packages("com.owennewburn.")
            .classes(TestController::class.java)
            .mainClass(this.javaClass)
            .start()
    }
}

TestController.kt

package com.owennewburn.myapp

import com.owennewburn.generated.api.TestApi

class TestController: TestApi {

    override fun helloWorld(): String {
        return "Hello World"
    }
}

Затем у меня есть простой тест, который пытается выполнить GET /test и проверить ответ.

В этом состоянии тест не пройден , но если я переместлю интерфейс в каталог sr c с остальной частью кода приложения, он будет работать . Есть идеи, почему это будет? В обоих случаях код создается и выполняется, но только когда интерфейс находится в главном каталоге проекта, конечная точка создается при запуске кода.

1 Ответ

0 голосов
/ 20 апреля 2020

В конце концов, это проблема сборки. В моем файле build.gradle sourceSets выглядел следующим образом:

sourceSets {
    main {
        kotlin {
            srcDirs += 'src/main/kotlin'
            srcDirs += files("${openApiSourceDir}/src/gen/java")
        }
    }
}

Этого было достаточно для успешной компиляции кода, но создавались бы только скомпилированные версии файлов kotlin, а не интерфейсы java. Micronaut использует данные времени компиляции для реализации внедрения зависимостей , поэтому, не имея интерфейсов, доступных на пути к классам, они не обнаруживаются, когда выполняется сканирование пакета для информирования о внедрении зависимостей.

Я исправил это изменив build.gradle на:

sourceSets {
    main {
        kotlin {
            srcDirs += 'src/main/kotlin'
            srcDirs += files("${openApiSourceDir}/src/gen/java")
        }
        java {
            srcDirs += files("${openApiSourceDir}/src/gen/java")
        }

    }
}
...