Джерси и Spring Boot с несколькими ResourceConfig [дубликат]

Если вы хотите использовать timeit в интерактивном сеансе Python, есть два удобных варианта:

  1. Используйте оболочку IPython . Он имеет удобную специальную функцию %timeit:
    In [1]: def f(x):
       ...:     return x*x
       ...: 
    
    In [2]: %timeit for x in range(100): f(x)
    100000 loops, best of 3: 20.3 us per loop
    
  2. В стандартном интерпретаторе Python вы можете получить доступ к функциям и другим именам, которые вы определили ранее во время интерактивного сеанса, импортировав их из __main__ в настройке утверждение:
    >>> def f(x):
    ...     return x * x 
    ... 
    >>> import timeit
    >>> timeit.repeat("for x in range(100): f(x)", "from __main__ import f",
                      number=100000)
    [2.0640320777893066, 2.0876040458679199, 2.0520210266113281]
    

12
задан Alejandro Agapito Bautista 4 February 2016 в 19:09
поделиться

3 ответа

Ошибка, которую вы видите, не связана с вашей конфигурацией безопасности, вы можете взглянуть на этот билет, https://github.com/spring-projects/spring-boot/issues/3260

Если вы хотите разрешить весь трафик до конечных точек прошлого /public, вы можете добавить RequestMatcher в список игнорирования Spring Security.

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) throws Exception {

        web.ignoring().antMatchers("/rest/public/**");
     }

     protected void configure(HttpSecurity http) throws Exception {

          http.authorizeRequests().antMatcher("/rest/private/**")
          .anyRequest().authenticated().and()
          .httpBasic().and()
          .csrf().disable()
     }

}

http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#jc

0
ответ дан francis 20 August 2018 в 10:25
поделиться

В контейнере сервлета, время выполнения Джерси, выполняется как сервлет или как фильтр сервлета. Как весна 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;
    }
    

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

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

8
ответ дан Paul Samsotha 20 August 2018 в 10:25
поделиться
  • 1
    Я использовал второй вариант, спасибо вам большое, это было действительно полезно :) – Alejandro Agapito Bautista 25 February 2016 в 17:33

Вам не будет разрешено создавать два компонента для вашего класса ресурсов. Вы можете достичь того, чего вы пытаетесь достичь, используя один класс ресурсов.

Вот пример:

@Path("rest")
public class SampleResourceClass {

  @Path("/public/pings")
  @GET
  public Responce getPings(){
    /* Code Here */
  }

  @Path("/private/accounts")
  @GET
  public Response getAccounts(){
    /* Code Here */
  }
}
0
ответ дан user2004685 20 August 2018 в 10:25
поделиться
  • 1
    Да, я это понимаю, но я хочу создать множество публичных конечных точек, и таким образом я могу использовать только эти классы. – Alejandro Agapito Bautista 4 February 2016 в 19:52
Другие вопросы по тегам:

Похожие вопросы: