Azure IOT hub - отвечает на отсутствующие данные устройства

В контейнере сервлета, время выполнения Джерси, выполняется как сервлет или как фильтр сервлета. Как весна boot настраивает сервлеты и фильтры через ServletRegistrationBean s и FilterRegistrationBeans, соответственно. Чтобы получить представление о том, как эта конфигурация работает за сценой, вы можете посмотреть исходный код для JerseyAutoConfiguration

. В JerseyAutoConfiguration вы можете видеть, что ResourceConfig, и это ResourceConfig, используемый для создания фильтра сервлетов Джерси или Джерси (в зависимости от вашего выбора конфигурации). Поэтому причиной ошибки является то, что вы не можете иметь двусмысленные бобы, у вас есть две ResourceConfig бобы. Поэтому Spring не знает, какой из них вводить.

Однако вы можете использовать два разных сервлета для каждого ResourceConfig. Проблема в том, что Spring Boot только привязывает вас к одному сервлету для Джерси, поэтому вам нужно настроить другой. Существует два варианта:

  1. Используйте автоматическую конфигурацию 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;
    }
    
  2. Не используйте конфигурацию Spring Boot вообще. Просто создайте два 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;
    }
    

Лично я предпочитаю второй вариант, так как легче рассуждать о конфигурациях, когда все они находятся в одном месте.

Еще одно замечание заключается в том, что два приложения Джерси будут полностью независимыми, то есть вам нужно будет зарегистрировать поставщиков (например, фильтры) для обоих приложений

0
задан Wouter van Koppen 15 January 2019 в 17:44
поделиться