Как сделать, чтобы Springboot-аннотированные классы загружались правильно, когда они находятся в библиотеке? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть работающее приложение Spring Boot, которое включает в себя такой класс:

@RestController
@Validated
@RequestMapping("/HelloWorld")
public class HelloWorldController
{
    private static int foo = getFoo ();

    private static int getFoo ()
    {
        System.out.println ("HelloWorldController getFoo");
        return 0;
    }

    public HelloWorldController ()
    {
        System.out.println ("HelloWorldController Constructor");
    }

    @GetMapping("/get")
    public HelloWorld root ()
    {
        return new HelloWorld ("Hello, world!");
    }
}

Запрос /get обслуживается, как и ожидалось. Когда приложение запускается, я вижу оба выхода println.

В отдельном проекте у меня есть похожий класс:

@RestController
@Validated
@RequestMapping("/api")
public class ModularAPIDemoController
{
    private static int foo = getFoo ();

    private static int getFoo ()
    {
        System.out.println ("ModularAPIDemoController getFoo");
        return 0;
    }

    public ModularAPIDemoController ()
    {
        System.out.println ("ModularAPIDemoController Constructor");
    }

    @GetMapping("/get")
    public Message root ()
    {
        return new Message ();
    }
}

Второй класс встроен в библиотеку mylib с использованием maven и приложение pom.xml включает его с

<dependency>...<artifactId>mylib</artifactId>...</dependency>

Когда строится application.jar, я вижу mylib.jar в BOOT-INF/lib, однако, когда служба запускается, я вижу println с HelloWorldController но не из ModularAPIDemoController, и запрос /api/get не работает.

Мне нужна библиотека java, которая включает в себя @RequestMapping аннотированные классы, а также другие аннотации Spring, такие как @Configuration и @EnableWebSecurity и многое другое.

Библиотеки и приложения создаются с помощью Maven. Как я могу настроить его так, чтобы Spring загружал аннотированные классы, которые находятся в зависимости от библиотеки?

Ответы [ 2 ]

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

В вашем проекте есть класс, который помечен @SpringBootApplication. По умолчанию Spring Boot сканирует все подпакеты (включая пакет, в котором расположен этот класс) на наличие компонентов (например, аннотированных классов). Если ваша библиотека не находится в некоторых подпакетах, вы можете сделать ее пригодной для сканирования компонентов, добавив пакет root вашей библиотеки в @SpringBootApplication, как документировано т.е.

@SpringBootApplication(scanBasePackages = {"path.to.your.project.root", "path.to.your.library.root"})

Таким образом Spring Boot также сканирует вашу библиотеку на наличие компонентов. Как следствие того, как работает @ComponenScan, вы должны поместить свой @SpringBootApplication -аннотированный класс в четко определенный пакет root вашего проекта (например, org.foo.bar). Не помещайте аннотированный класс @SpringBootApplication в пакет по умолчанию, поскольку Spring Boot может сканировать компоненты из других библиотек, которые вы не хотите проверять.

Однако я не уверен, помещал ли я эти классы в библиотеку ...

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

Добавьте явно пакеты, которые вы сканируете для этих компонентов. Используйте аннотацию @ComponentScan вместе с аннотацией @SpringBootApplication, чтобы перезаписать поведение по умолчанию и добавить два корня пакета следующим образом:

@ComponentScan(basePackages = {"package1", "package2"})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...