В контейнере сервлета, время выполнения Джерси, выполняется как сервлет или как фильтр сервлета. Как весна boot настраивает сервлеты и фильтры через ServletRegistrationBean
s и FilterRegistrationBeans
, соответственно. Чтобы получить представление о том, как эта конфигурация работает за сценой, вы можете посмотреть исходный код для JerseyAutoConfiguration
. В JerseyAutoConfiguration
вы можете видеть, что ResourceConfig
, и это ResourceConfig
, используемый для создания фильтра сервлетов Джерси или Джерси (в зависимости от вашего выбора конфигурации). Поэтому причиной ошибки является то, что вы не можете иметь двусмысленные бобы, у вас есть две ResourceConfig
бобы. Поэтому Spring не знает, какой из них вводить.
Однако вы можете использовать два разных сервлета для каждого ResourceConfig
. Проблема в том, что Spring Boot только привязывает вас к одному сервлету для Джерси, поэтому вам нужно настроить другой. Существует два варианта:
ServletRegistrationBean
для вашего другого. Следует отметить, что ResourceConfig
для вашего созданного ServletRegistrationBean
не должен быть компонентом Spring (т. Е. Нет @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;
}
ServletRegistrationBean
s. В этом случае ни один из ваших классов ResourceConfig
не должен быть весенним бобам. @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;
}
Лично я предпочитаю второй вариант, так как легче рассуждать о конфигурациях, когда все они находятся в одном месте.
Еще одно замечание заключается в том, что два приложения Джерси будут полностью независимыми, то есть вам нужно будет зарегистрировать поставщиков (например, фильтры) для обоих приложений