SpringBoot, Maven и бобы в суб-банках - PullRequest
       2

SpringBoot, Maven и бобы в суб-банках

0 голосов
/ 11 сентября 2018

У меня есть пара артефактов maven:

- server (springboot application)
 - api
  - api-impl-01
  - api-impl-02

Существует две реализации API: api-impl-01 и api-impl-02.В каждом артефакте есть весенние бобы.Бобы из api-impl-01 / api-impl-02 загружаются при помощи пружинной поддержки Condition / @ Conditional.Окончательная структура jar выглядит следующим образом:

springboot-app.jar
 - BOOT-INF
  - classes
   - server artefact classes
  - lib
   - api.jar
   - api-impl-01.jar
   - api-impl-02.jar

Серверный jar содержит api.jar, api-impl-01.jar и api-impl-02.jar в каталоге BOOT-INF / lib и классахс сервера находятся в каталоге BOOT-INF / classes.

Проблема в том, что bean-компоненты из внутренних jar-файлов (api * .jar) не загружены.Приложению не удалось запуститься с ошибкой: для поля dbBean в pat.RestEndpoint требуется компонент типа 'pat.ApiBean', который не может быть найден.

Пожалуйста, кто-нибудь может предложить решение?Я не хочу помещать весь исходный код в один большой артефакт maven.

Спасибо

артефакт 'api':

package pat.multidemo.dal.spi;
public interface DalSpi {
    public void print(String msg);
}

и

package pat.multidemo.dal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pat.multidemo.dal.spi.DalSpi;
@Service
public class Dal {
    @Autowired
    private DalSpi dalSpi;
    public void test(String msg) {
        dalSpi.print(msg);
    }
}

артефакт 'impl01':

package pat.multidemo.dal.spi.impl01;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class Condition01 implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return "impl01".equals(System.getProperty("spi.impl"));
    }
}


package pat.multidemo.dal.spi.impl01;
import pat.multidemo.dal.spi.DalSpi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config01 {
    @Bean(name = "dal.spi.provider")
    @Conditional(value = Condition01.class)
    public DalSpi dalSpiProvider() {
        return new DalSpi01();
    }
}

и

package pat.multidemo.dal.spi.impl01;
import pat.multidemo.dal.spi.DalSpi;
public final class DalSpi01 implements DalSpi {
    @Override
    public void print(String msg) {
        System.err.println(this.getClass().getName() + " -> " + msg);
    }
}

артефакт 'impl02' (в основном такой же, как 'impl01'):

package pat.multidemo.dal.spi.impl02;
...
public class Condition02 implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return "impl02".equals(System.getProperty("spi.impl"));
    }
}


package pat.multidemo.dal.spi.impl02;
...
@Configuration
public class Config02 {
    @Bean(name = "dal.spi.provider")
    @Conditional(value = Condition02.class)
    public DalSpi dalSpiProvider() {
        return new DalSpi02();
    }
}

и

package pat.multidemo.dal.spi.impl02;
import pat.multidemo.dal.spi.DalSpi;
public final class DalSpi02 implements DalSpi {
    @Override
    public void print(String msg) {
        System.err.println(this.getClass().getName() + " -> " + msg);
    }
}

артефакт 'сервера' (приложение):

package pat.multidemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MultiDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(MultiDemoApplication.class, args);
    }
}


package pat.multidemo;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.stereotype.Component;
@Component
public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        registerEndpoints();
    }
    private void registerEndpoints() {
        register(Endpoint.class);
    }
}

и

package pat.multidemo;
import pat.multidemo.dal.Dal;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@Path("/test")
public final class Endpoint {
    @Autowired
    private Dal dal;
    @GET
    @Path("/ping")
    @Produces("text/plain")
    public String ping(@Context HttpServletRequest servletRequest) {
        dal.test("rest endpoint");
        return "done";
    }
}

1 Ответ

0 голосов
/ 13 сентября 2018

Спасибо, Даффимо. Я должен сделать это:

Добавить этот класс в 'api'

package pat.multidemo.dal;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DalConfig {
    @Bean(name = "dal.provider")
    public Dal dalProvider() {
        return new Dal();
    }
}

Создайте файл «spring.factories» в каталоге META-INF в проектах «api», «impl01» и «impl02» со строкой:

  • 'api' - org.springframework.boot.autoconfigure.EnableAutoConfiguration = pat.multidemo.dal.DalConfig

  • 'impl01' - org.springframework.boot.autoconfigure.EnableAutoConfiguration = pat.multidemo.dal.spi.impl01.Config01

  • 'impl02' - org.springframework.boot.autoconfigure.EnableAutoConfiguration = pat.multidemo.dal.spi.impl02.Config02

Это работает для меня.

Спасибо

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