2017-02-15 10 views
0

У меня есть 2 проекта, основной проект весеннего ботинка и второй проект весны, содержащий @Contollers, @Services и т. Д.@ComponentScan из 2-х пакетов

Я пытаюсь использовать некоторые из этих услуг в основном проекте. Я видел подобные вопросы, как here, here, here и многие другие, но это не работает для меня

1), если у меня есть только

@SpringBootApplication 
public class App { ... } 

тогда он не компилируется, потому что не может найти услуги от второй проект

2) при попытке сканирования второго пакета

@SpringBootApplication 
@ComponentScan("secondPackage") 
public class App {} 

то приложение ул без ошибок, но сопоставление контроллеров вообще не работает. Картирование из обоих проектов не может быть разрешено.

3), то я попытался исключить контроллеры из второго пакета, потому что они не нужно, отображение до сих пор не работает

@ComponentScan(basePackages="secondPackage", excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)}) 

4), то я пытался просканировать конкретные услуги, но и в этом случае других ресурсы не доступны, и я должен включать в гораздо дорожкам

@ComponentScan({"first package", "second package"}) 

5) наконец, я пытался сделать 2 конфигурационные файлы

@Configuration 
@ComponentScan(basePackages = {"mainPackage"}) 
public class MainConfiguration { 

} 

@Configuration 
@ComponentScan(basePackages="secondPackage", 
     excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION, value = Controller.class)}) 
public class SecondConfiguration { 

} 

но я не нашел пример, как я могу подготовить контекст до SpringApplication.run (App.class, args); а затем запустите приложение в моем контексте. как

ApplicationContext myContext = new AnnotationConfigApplicationContext(OrderStatusConfiguration.class, ShopRuServicesConfiguration.class); 
SpringApplication.run(App.class, myContext, args); 

Поэтому, пожалуйста, дайте мне совет, почему отображение не работает или как я должен надлежащий autowire услуг от второго проекта!

Я ценю любую помощь! Благодаря!

+0

Я думаю, что идея совместного использования кода между двумя различными контекстами приложений SpringBoot противоречит всей идее наличия двух приложений. Я бы предложил создать третий проект SpringBoot с общим кодом и предоставить функции через RestAPI. – Fernando

+0

второе приложение - обычное весеннее приложение mvc, и около 30% классов необходимы в первом загрузочном приложении весны. реализация службы отдыха была моей первой идеей, но это не вариант, потому что тогда вся работа будет выполняться на одном сервере, где находится второе приложение. этот сервер уже перегружен – Slava

+0

, конечно, я могу просто скопировать весь код, но в случае его изменения мне придется менять несколько мест вместо одного. Я думаю, что должен быть какой-то способ повторно использовать службы из другого модуля, который включен как зависимость – Slava

ответ

0

1) Пустая аннотация инициирует сканирование компонентов по умолчанию. Это начинается с пакета аннотированного класса

@SpringBootApplication 
public class App { ... } 

Чем вы говорите, он даже не компилируется.

Это означает, что ваша весенняя конфлигментация ссылается на некоторые классы по имени, которые не находятся в пути к классам.

2) При добавлении @ComponentScan компонента по умолчанию сканирования 1) не выполняется, а сканирование производится только начиная с '' secondPackage

@SpringBootApplication 
@ComponentScan("secondPackage") 
public class App {} 

чем вы пишете

отображение делает не работает вообще

Это может означать, что контроллер вообще не включен в конфигурацию пружины.

Чтобы решить эту проблему, вы можете попробовать

@SpringBootApplication 
@ComponentScan({"package of App","secondPackage"}) 
public class App {} 

, который может дать вам результат вы ожидали от 2)

Если самка не работает, я бы предложил создать классы конфигурации Java в ссылочных проектах , которые настраивают только то, что вам нужно в вашем приложении.

Используйте @Import для импорта этих конфигураций. Таким образом вы ссылаетесь на классы конфигурации в своем приложении и проверяете правильность настройки пути к классам.

Если ваше приложение по-прежнему не настроило службы и сопоставления правильно, вы можете точно настроить ссылки, пока не получите именно тот весенний контекст, который вам нужен.

+0

Спасибо @Stefan, я попробовал @ComponentScan ({«первый», «второй»}), и в этом случае приложение скомпилировано, и я могу вызывать контроллеры из основного класса приложения, но отображение по-прежнему прерывается. Странная вещь заключается в том, что в 1-м приложении имеется около 3 отображаемых URL-адресов и около 4 путей в 2-D модуле, и оба они сломаны. Я пойму, если один из них будет работать. Это будет означать, что некоторая конфигурация переписывает другую, но в этом случае они оба сломаны. Не могли бы вы привести пример конфигурации для импорта? Предположим, мне нужно автоувеличивать одну услугу из второго проекта в контроллере базового приложения. – Slava

+0

Проблема заключается в том, что ComponentScan разбивает отображение и без ComponentScan приложение не увидит другой пакет, а также класс конфигурации. Поэтому я должен попробовать что-то вроде @Import ({AppConfigWeb.class}) @ImportResource ("classpath: /config/spring.xml")? – Slava