Spring Boot загружает бины из другого модуля - PullRequest
0 голосов
/ 14 мая 2018

У меня есть два модуля maven:

api-module
commons-module

API-модуль содержит пакет com.example.api , а модуль commons содержит пакет com.example.commons .

Когда я запускаю основное приложение com.example.api.ApiMain , выполнение не выполняется. Это потому, что у меня есть классы репозитория Mongo, определенные в пакете commons . Контроллеры API зависят от них, и, поскольку они не создаются до бобов api , выполнение завершается неудачно.

Вот основное приложение API:

package com.example.api;

@SpringBootApplication
@ComponentScan({"com.example.commons", "com.example.api"})
public class ApiMain {
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

    public static void main(String[] args) {
        SpringApplication.run(ApiMain.class, args);
    }
}

Как убедиться, что компоненты com.example.commons сканируются до загрузки bean-компонентов в com.example.api ?

Я могу использовать аннотацию @ DependsOn для каждого компонента в com.example.api , но в будущем будет добавлено несколько классов и еще несколько, и это сделает код уродливым .

Эта проблема может быть решена, если есть способ настроить пружину на загрузку компонентов из commons-module сначала.

Вы можете научить меня, как это сделать.

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я столкнулся с той же проблемой. Я использовал приведенный ниже код для контроллера Rest API

@RestController
@EnableOAuth2Sso
@EnableResourceServer
@SpringBootApplication
public class SpringBootWebApplication extends WebSecurityConfigurerAdapter {

    //Dependancy injection using autowire
    @Autowired
    OAuth2ClientContext oauth2ClientContext;
    public static void main(String[] args) throws Exception {
        SpringApplication.run(SpringBootWebApplication.class, args);
    }

Использование этого кода для обычного контроллера, отображающего мою HTML-страницу

@Configuration
@EnableAutoConfiguration
@Controller
public class WelcomeController {

Попробуйте и дайте мне знать, если это работает или у вас все еще есть проблемы.

0 голосов
/ 14 мая 2018

Независимо от того, какой пакет сканируется первым, это не имеет значения, поскольку Spring создаст граф зависимостей и определит порядок, в котором создаются бины. Если вы хотите, чтобы определенные bean-компоненты создавались раньше других, как, скажем, BeanA зависит от BeanB, тогда BeanA будет иметь конструктор @Autowired BeanA(BeanB b).

Выяснение порядка создания экземпляров является фундаментальным аспектом Spring Dependency Injection, я бы посоветовал вам прочитать немного больше о Spring DI, потому что я не думаю, что вы понимаете концепцию инверсии управления и то, что делает Spring DI .

Но для меня это звучит так: у вас есть что-то вроде:

public class BeanA {
    @Autowired
    BeanB b;
    public BeanA() {
        b.doSomething();
    }
}

Но b по-прежнему равен нулю, когда вызывается конструктор BeanA. Поскольку вы выполняете какую-то инстанцирование в BeanA с BeanB, вы получаете NullPointerException, вместо этого вы должны иметь: BeanA(BeanB b).

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