Если вы хотите использовать timeit
в интерактивном сеансе Python, есть два удобных варианта:
%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
__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]
Ошибка, которую вы видите, не связана с вашей конфигурацией безопасности, вы можете взглянуть на этот билет, 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
В контейнере сервлета, время выполнения Джерси, выполняется как сервлет или как фильтр сервлета. Как весна 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;
}
Лично я предпочитаю второй вариант, так как легче рассуждать о конфигурациях, когда все они находятся в одном месте.
Еще одно замечание заключается в том, что два приложения Джерси будут полностью независимыми, то есть вам нужно будет зарегистрировать поставщиков (например, фильтры) для обоих приложений
Вам не будет разрешено создавать два компонента для вашего класса ресурсов. Вы можете достичь того, чего вы пытаетесь достичь, используя один класс ресурсов.
Вот пример:
@Path("rest")
public class SampleResourceClass {
@Path("/public/pings")
@GET
public Responce getPings(){
/* Code Here */
}
@Path("/private/accounts")
@GET
public Response getAccounts(){
/* Code Here */
}
}