Несколько путей с использованием jax.rs [duplicate]

позволяет установить один и тот же словарь в каждом из следующих и проверить время выполнения.

Аргумент настройки в основном настраивает словарь

. Номер предназначен для запуска кода 1000000 раз , Не настройка, а stmt

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

Код в основном пытается получить значение c в словаре.

import timeit

print('Getting value of C by index:', timeit.timeit(stmt="mydict['c']", setup="mydict={'a':5, 'b':6, 'c':7}", number=1000000))
print('Getting value of C by get:', timeit.timeit(stmt="mydict.get('c')", setup="mydict={'a':5, 'b':6, 'c':7}", number=1000000))

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

по индексу: 0.20900007452246427

по get: 0.54841166886888

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 18 August 2018 в 14:10
поделиться

В контейнере сервлета, время выполнения Джерси, выполняется как сервлет или как фильтр сервлета. Как весна 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 18 August 2018 в 14:10
поделиться
  • 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 18 August 2018 в 14:10
поделиться
  • 1
    Да, я это понимаю, но я хочу создать множество публичных конечных точек, и таким образом я могу использовать только эти классы. – Alejandro Agapito Bautista 4 February 2016 в 19:52
Другие вопросы по тегам:

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