我已经找到了带有答案的问题,但它们对我没有帮助。
我有一个Web servlet项目,在其中使用Spring Controller(4.2.5)和Spring Security(4.0.2)。我不使用Spring Boot。
我的项目工作正常。
但现在我的任务是: 使@RequestMapping(value={"auth/**"}配置(替换"auth/**"用${dm.filterPattern})
@RequestMapping(value={"auth/**"}
"auth/**"
${dm.filterPattern}
问题:@RequestMapping ${dm.filterPattern}尽管处理了@ PropertySource,in仍无法解析。
@RequestMapping
这是dm.filterPatterndmConfig.properties中的条目:
dm.filterPattern
dm.filterPattern=/auth/*
这是一些基本代码,带有所有Spring注释。
该方法的输出init()显示@PropertySource已正确处理。env.getProperty("...")返回正确的值。
init()
@PropertySource
env.getProperty("...")
@Controller @PropertySource("classpath:/dmConfig.properties") @RequestMapping(value ={ "${dm.filterPattern}"}) public class DmProxyController implements ApplicationContextAware { private Environment env; @Autowired public DmProxyController(Environment env) { this.env = env; } @RequestMapping(path={"${dm.filterPattern}"} ,method = RequestMethod.POST) protected void doPost(HttpServletRequest customerRequest, HttpServletResponse response) throws ServletException, IOException, DmException { // code for POST request } @RequestMapping(path={"${dm.filterPattern}"} ,method = RequestMethod.GET) protected void doGet(HttpServletRequest customerRequest, HttpServletResponse response) throws ServletException, IOException, DmException { // code for GET request } @PostConstruct public void init() throws ServletException { RequestMappingHandlerMapping requestMapping= (RequestMappingHandlerMapping) appContext.getBean("requestMappingHandlerMapping"); Map<RequestMappingInfo, HandlerMethod> handlerMethods = requestMapping.getHandlerMethods(); logger.debug("RequestMapping via dm.filterPattern: {}", env.getProperty("dm.filterPattern")); logger.debug("Handler Methods: {}", handlerMethods.size()); for (RequestMappingInfo mapInfo : handlerMethods.keySet()) { logger.debug(" Mappinginfo: {} --> {}", mapInfo, handlerMethods.get(mapInfo)); } } }
@Configuration @PropertySource("classpath:/dmConfig.properties") @ComponentScan(basePackages = "com.dm.filter, com.dm.controller") @EnableTransactionManagement(mode = AdviceMode.PROXY, proxyTargetClass = false) @Import({DmSecurityConfigurer.class, DmWebConfigurer.class}) public class DmRoot { }
public class DmDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[]{DmRoot.class}; } @Override protected Class<?>[] getServletConfigClasses() { return null; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } @Override protected String getServletName() { return "dmDispatcherServlet"; } @Override protected void customizeRegistration(ServletRegistration.Dynamic registration) { super.customizeRegistration(registration); registration.setLoadOnStartup(1); } }
public class DmWebConfigurer extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { super.addResourceHandlers(registry); registry.addResourceHandler("/index.html").addResourceLocations("/"); registry.setOrder(Integer.MAX_VALUE-5); } }
public class DmSecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { public DmSecurityWebApplicationInitializer() { // some logging } @Override protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { // adding own filters } @Override protected void afterSpringSecurityFilterChain(ServletContext servletContext) { // adding own filters } }
@EnableWebMvc @EnableWebSecurity @PropertySource("classpath:dmConfig.properties") public class DmSecurityConfigurer extends WebSecurityConfigurerAdapter { private static Logger logger = LogManager.getLogger(DmSecurityConfigurer.class.getName()); @Autowired private Environment env; @Autowired private UserDetailsService dmUserDetailsService; @Override protected void configure(HttpSecurity httpSecurity) throws Exception { String urlPattern = env.getProperty("dm.springSecurityPattern"); String realmName = env.getProperty("dm.springSecurityRealm"); httpSecurity.httpBasic().realmName(realmName) .and().userDetailsService(dmUserDetailsService) .authorizeRequests() .antMatchers(urlPattern).authenticated() .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .csrf().disable(); } }
有可能PropertySourcesPlaceholderConfigurer在弹簧上下文中比控制器晚初始化,因此无法解析这些值。尝试PropertySourcesPlaceholderConfigurer在以下一个根配置文件中添加显式Bean定义;
PropertySourcesPlaceholderConfigurer
@PropertySource("classpath:/dmConfig.properties") public class DmWebConfigurer extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { super.addResourceHandlers(registry); registry.addResourceHandler("/index.html").addResourceLocations("/"); registry.setOrder(Integer.MAX_VALUE-5); } @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } }
之所以可以在init()方法中正确看到这些值,是因为在初始化所有的bean(包括)之后调用了它PropertySourcesPlaceholderConfigurer。