如何在eclipse动态Web项目中设置资源目录?

时间:2015-06-08 09:01:32

标签: java eclipse spring location classpath

我想构建一个使用最少库的Web项目。所以我所做的就是下面描述的

  • 在Eclipse中制作动态Web项目(Luna)
  • 配置为Maven项目
  • 并在pom.xml中导入一些库
  • 实施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/中。 考虑到分发,我不能在代码中使用绝对路径。

我需要从项目服务器中引用关系位置。有一些方法可以使用HttpServletRequestServletContext找到该目录,但我不能这样做,因为那些部分 - propertyPlaceholder()部分 - 是静态方法。

有没有好的例子或解决方案呢? 我真的不想使用Spring Templates或xml。 是否有可能我只想用java文件做什么?

谢谢你回答:D

3 个答案:

答案 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。这是我正在寻找的解决方案。