У меня есть пара артефактов 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";
}
}