Spring控制器:如何在@RequestMapping中使用属性$ {..}?

我已经找到了带有答案的问题,但它们对我没有帮助。

我有一个Web servlet项目,在其中使用Spring Controller(4.2.5)和Spring

Security(4.0.2)。我不使用Spring Boot。

我的项目工作正常。

但现在我的任务是:

(替换"auth/**"${dm.filterPattern}

这是dm.filterPatterndmConfig.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

回到顶部