26

下のファイル(またはディレクトリ)を取得しようとしています/WEB-INF/.../

リクエストの外。サーバーの起動時にロードされたBeanに必要です。

私が見つけることができるすべてのソリューションはClassPathXmlApplicationContext、サーブレットコンテキストを取得するための、またはリクエストを使用するか、現在実行中のクラスを使用するXMLファイルを必要とします。私には醜いようです。

どうすれば取得できますかFile("/WEB-INF/myDir/")。方法がなければならない、いや!?

4

7 に答える 7

48

ServletContextBeanがWebアプリケーションのコンテキストで宣言されている限り、 (を使用してServletContextAware、または自動配線によって)のインスタンスを取得できます。

getResourceAsStream()次に、webappディレクトリ内のファイルに直接( 、getRealPath())、またはを使用してアクセスできますServletContextResource

momoによる編集:

@Autowired
ServletContext servletContext;

... myMethod() { 
     File rootDir = new File( servletContext.getRealPath("/WEB-INF/myDIR/") );
}
于 2012-06-26T15:29:42.400 に答える
10

Spring DefaultResourceLoaderResourceを使用して、WEB-INF内または*.jarファイル内のリソースを読み取ります。魅力のように働きます。幸運を!

import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;

public static void myFunction() throws IOException {
    final DefaultResourceLoader loader = new DefaultResourceLoader();               
    LOGGER.info(loader.getResource("classpath:META-INF/resources/img/copyright.png").exists());             
    Resource resource = loader.getResource("classpath:META-INF/resources/img/copyright.png");           
    BufferedImage watermarkImage = ImageIO.read(resource.getFile());
}
于 2014-03-07T13:54:16.623 に答える
3
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("files/test.xml").getFile());

「files」フォルダは「main/resources」フォルダの子である必要があります

于 2015-06-29T05:26:37.913 に答える
2

ファイルがWEB_INF\classesディレクトリにある場合は、クラスパスリソースを使用できます。src/main/resourcesこれは、通常のMavenビルドを使用してディレクトリ内のファイルがコピーされる場所です...

import org.springframework.core.io.Resource
...
final Resource yourfile = new ClassPathResource( "myfile.txt");
于 2012-06-26T15:20:46.030 に答える
0

これは、(ServletContextを介してではなく)サービスからアクセスしたい場合の方法です。

    final DefaultResourceLoader loader = new DefaultResourceLoader();
    Resource resource = loader.getResource("classpath:templates/mail/sample.png");
    File myFile = resource.getFile();

最後の行がスローされる可能性IOExceptionがあるため、キャッチ/再スローする必要があることに注意してください

ファイルはここにあることに注意してください: src\main\resources\templates\mail\sample.png

于 2015-09-07T20:04:54.873 に答える
-1

あなたの質問とは完全には関係ありませんが...これは、SpringのようにWebアプリケーションのどこからでもプロパティをロードするために使用したユニバーサルソリューションです(WEB-INF / ...、classpath:...、file:..をサポートしています。 。)。の使用に基づいていServletContextResourcePatternResolverます。が必要になりますServletContext

private static Properties loadPropsTheSpringWay(ServletContext ctx, String propsPath) throws IOException {
    PropertiesFactoryBean springProps = new PropertiesFactoryBean();
    ResourcePatternResolver resolver = new ServletContextResourcePatternResolver(ctx);
    springProps.setLocation(resolver.getResource(propsPath));
    springProps.afterPropertiesSet();
    return springProps.getObject();
}

conextがまだロードされていないときに、カスタムサーブレットコンテキストリスナーで上記のメソッドを使用しました。

于 2016-11-10T12:00:17.037 に答える
-1
request.getSession().getServletContext().getResourceAsStream("yourfile.pdf");
于 2018-11-05T19:57:21.883 に答える