Spring控制器:如何在@RequestMapping中使用属性$ {..}?
我已经找到了带有答案的问题,但它们对我没有帮助。
我有一个Web servlet项目,在其中使用Spring Controller(4.2.5)和Spring
Security(4.0.2)。我不使用Spring Boot。
我的项目工作正常。
但现在我的任务是:
(替换"auth/**"
用${dm.filterPattern}
)
这是dm.filterPattern
dmConfig.properties中的条目:
dm.filterPattern=/auth/*
这是一些基本代码,带有所有Spring注释。
控制器:
该方法的输出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));
}
}
}
具有bean定义的类
@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
{
}
DispatcherServletInitializer
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);
}
}
Web配置器
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);
}
}
SecurityWebApplicationInitializer
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定义;
@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
。
以上是 Spring控制器:如何在@RequestMapping中使用属性$ {..}? 的全部内容, 来源链接: utcz.com/qa/422542.html