Ответ 1
В контейнере сервлета, время выполнения Джерси, выполняется как сервлет или как фильтр сервлета. Как spring boot настраивает сервлеты и фильтры через ServletRegistrationBean
и FilterRegistrationBeans
, соответственно. Чтобы понять, как эта конфигурация работает за сценой, вы можете посмотреть исходный код JerseyAutoConfiguration
В JerseyAutoConfiguration
вы можете увидеть, что вводится ResourceConfig
, и это ResourceConfig
используется для создания фильтра сервлетов Джерси или Джерси (в зависимости от вашего выбора конфигурации). Поэтому причиной ошибки является то, что вы не можете иметь двусмысленный beans, который у вас есть два ResourceConfig
beans. Таким образом, spring не знает, какой из них вводить.
Что вы можете сделать, это использовать два разных сервлета для каждого ResourceConfig
. Проблема в том, что spring Boot только подключает вас к одному сервлету для Джерси, поэтому вам нужно настроить другой. Существует два варианта:
-
Используйте автоматическую конфигурацию загрузки spring для одного из приложений Джерси и добавьте еще один
ServletRegistrationBean
для вашего другого. Следует отметить, чтоResourceConfig
для вашего созданногоServletRegistrationBean
не должен быть компонентом spring (т.е. No@Component
или@Configuration
), иначе вы все равно столкнетесь с той же ошибкой.public class PublicConfig extends ResourceConfig { public PublicConfig() { register(PingResource.class); } } ... // in your Spring Boot configuration class @Bean public ServletRegistrationBean publicJersey() { ServletRegistrationBean publicJersey = new ServletRegistrationBean(new ServletContainer(new PublicConfig())); publicJersey.addUrlMappings("/rest/public/*"); publicJersey.setName("PublicJersey"); publicJersey.setLoadOnStartup(0); return publicJersey; }
-
Не используйте конфигурацию загрузки spring вообще. Просто создайте два
ServletRegistrationBean
s. В этом случае ни один из ваших классовResourceConfig
не должен быть spring beans.@Bean public ServletRegistrationBean publicJersey() { ServletRegistrationBean publicJersey = new ServletRegistrationBean(new ServletContainer(new PublicConfig())); publicJersey.addUrlMappings("/rest/public/*"); publicJersey.setName("PublicJersey"); publicJersey.setLoadOnStartup(0); return publicJersey; } @Bean public ServletRegistrationBean privateJersey() { ServletRegistrationBean privateJersey = new ServletRegistrationBean(new ServletContainer(new PrivateConfig())); privateJersey.addUrlMappings("/rest/private/*"); privateJersey.setName("PrivateJersey"); privateJersey.setLoadOnStartup(1); return privateJersey; }
Лично я предпочитаю второй вариант, так как легче рассуждать о конфигурациях, когда все они находятся в одном месте.
Еще одна вещь, которую следует отметить, заключается в том, что два приложения Джерси будут полностью независимыми, то есть вам нужно будет зарегистрировать поставщиков (например, фильтры) для обоих приложений.