我想构建一个使用最少库的Web项目。所以我所做的就是下面描述的
WebApplicationInitializer
我制作了2个配置类和初始化器,看起来像......
RootConfig.java
打算替换' root-context.xml' ...
@Configuration
public class RootConfig {
@Value(value="${jdbc.driverClassName}")
private String jdbcDriverClassName;
@Value(value="${jdbc.url}")
private String jdbcUrl;
@Value(value="${jdbc.username}")
private String jdbcUsername;
@Value(value="${jdbc.password}")
private String jdbcPassword;
private static final String RESOURCE_LOCATION = "resources";
@Bean
public static PropertyPlaceholderConfigurer propertyPlaceholder() {
PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
Resource[] resources = new ClassPathResource[]{
new ClassPathResource(RESOURCE_LOCATION + File.separator + "properties"
+ File.separator + "jdbc" + File.separator + "jdbc.properties")
};
ppc.setLocations(resources);
return ppc;
}
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(this.jdbcDriverClassName);
dataSource.setUrl(this.jdbcUrl);
dataSource.setUsername(this.jdbcUsername);
dataSource.setPassword(this.jdbcPassword);
return dataSource;
}
};
这是ServletConfig.java
,它假定要替换' servlet-context.xml' ...
@Configuration
@EnableWebMvc
@EnableAsync
@ComponentScan(
basePackages= {
"com.gosports.api.controller"
, "com.gosports.common.controller"
, "com.gosports.test.controller"
}
, excludeFilters=@ComponentScan.Filter(Configuration.class)
)
public class ServletConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver () {
InternalResourceViewResolver vResolver = new InternalResourceViewResolver();
vResolver.setPrefix("/WEB-INF/views/");
vResolver.setSuffix(".jsp");
return vResolver;
}
}
最后,我的初始化程序......
public class WASInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext arg0) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(RootConfig.class);
context.register(ServletConfig.class);
context.setServletContext(arg0);
Dynamic servlet = arg0.addServlet("dispatcher", new DispatcherServlet(context));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
}
};
它起作用,因为我把我的' jdbc.properties' /{project_location}/src/resources/properties/
中的文件。
但我想要做的是将此文件放在/WEB-INF/resources/properties/
中。
考虑到分发,我不能在代码中使用绝对路径。
我需要从项目服务器中引用关系位置。有一些方法可以使用HttpServletRequest
和ServletContext
找到该目录,但我不能这样做,因为那些部分 - propertyPlaceholder()
部分 - 是静态方法。
有没有好的例子或解决方案呢? 我真的不想使用Spring Templates或xml。 是否有可能我只想用java文件做什么?
谢谢你回答:D
答案 0 :(得分:0)
你可以获得Thread#getContextClassLoader()返回的classLoader。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
/ WEB-INF文件夹不在类路径的根目录中,而是在/ WEB-INF / classes文件夹中,您需要从中加载相对于的属性文件。
classLoader.getResourceAsStream("/jdbc.properties");
或者您可以将它们视为始终有效的资源。
AppServiceClass.class.getClassLoader().getResourceAsStream("/jdbc.properties");
答案 1 :(得分:0)
首先,您不应该使用PropertyPlaceholderConfigurer
,而应使用PropertySOurcesPlaceholderConfigurer
。接下来,不要自己加载文件,只需在课堂上使用@PropertySource
即可。将您的文件放在src/main/resources
中,然后maven将其添加到类路径中。
@Configuration
@PropertySource("classpath:/properties/jdbc/jdbc.properties")
public class RootConfig {
@Bean
public static PropertySources PlaceholderConfigurer propertyPlaceholder() {
return new PropertySourcesPlaceholderConfigurer();
}
}
这假定您创建的目录结构中的所有属性都在src/main/resources
中。
答案 2 :(得分:0)
感谢您的回答:D
但也许我的解释还不够,所以我必须找到出路。以下是我为Dynamic Web Project设置资源文件夹的解决方案。
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// TODO Auto-generated method stub
//super.addResourceHandlers(registry);
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926);;
}
坦率地说,我一直站到addResourceLocations
,但不是setCachePeriod
。这是我正在寻找的解决方案。