web-dev-qa-db-ja.com

Spring Bootがscr / main / resourcesにない静的リソースにアクセスする

私はSpring Bootアプリケーションに取り組んでいます。開始時にXMLファイル(countries.xml)を解析する必要があります。問題は、アクセスできるように配置する場所がわからないことです。私のフォルダ構造は

ProjectDirectory/src/main/Java
ProjectDirectory/src/main/resources/countries.xml

私の最初のアイデアはsrc/main/resourcesに配置することでしたが、ファイル(countries.xml)を作成しようとするとNPEが取得され、スタックトレースはファイルがProjectDirectoryで検索されることを示します(したがってsrc/main/resources /追加されません)。ファイル(resources/countries.xml)を作成しようとしましたが、パスはProjectDirectory/resources/countries.xmlのようになります(したがって、src/mainは追加されません)。

結果なしでこれを追加しようとしました

@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    super.addResourceHandlers(registry);
}

Src/main /を手動で追加できることは知っていますが、なぜそれが機能しないのかを理解したいと思います。 ResourceLoaderを使用した例も試しましたが、同じ結果は得られませんでした。

誰が問題が何であるかを提案できますか?

PDATE:将来の参考のために-プロジェクトをビルドした後、ファイルへのアクセスで問題が発生したため、FileをInputStreamに変更しました

InputStream is = new ClassPathResource("countries.xml").getInputStream();
53
lenach87

Springタイプ ClassPathResource を使用するだけです。

File file = new ClassPathResource("countries.xml").getFile();

このファイルがクラスパスのどこかにある限り、Springはそれを見つけます。これは、開発およびテスト中にsrc/main/resourcesになる場合があります。本番環境では、現在の実行ディレクトリにすることができます。

105
luboskrnac

Spring Bootアプリケーションを使用しているときに、resource.getFile()を使用してクラスパスリソースを取得することは、同じ問題に直面したため、JARとしてデプロイするのは困難です。このスキャンは、クラスパス内の任意の場所に配置されているすべてのリソースを見つけるStreamを使用して解決されます。

以下は同じコードスニペットです-

ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);
8

クラスパスのファイルを取得するには:

Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();

OnStartupでファイルを読み取るには、@PostConstructを使用します。

@Configuration
public class ReadFileOnStartUp {

    @PostConstruct
    public void afterPropertiesSet() throws Exception {

        //Gets the XML file under src/main/resources folder
        Resource resource = new ClassPathResource("countries.xml");
        File file = resource.getFile();
        //Logic to read File.
    }
}

Spring Boot Appの起動時にXMLファイルを読み取るための 小規模な例 を次に示します。

8
Sanjay Rawat

次のコードを使用して、リソースフォルダーから文字列のファイルを読み取ることができます。

final Resource resource = new ClassPathResource("public.key");
String publicKey = null;
try {
     publicKey = new String(Files.readAllBytes(resource.getFile().toPath()), StandardCharsets.UTF_8);
} catch (IOException e) {
     e.printStackTrace();
}
1
snj

私はスプリングブーツを使用しているので、簡単に使用できます:

File file = ResourceUtils.getFile("classpath:myfile.xml");
0
Galley

次の構成を使用する必要があります

InputStream in = getClass().getResourceAsStream("/yourFile");

ファイル名の前にこのスラッシュを追加する必要があることに注意してください。

0
Andrew Gans

私はSpring Bootを使用していますが、問題の解決策は

"src/main/resources/myfile.extension"

それが誰かを助けることを願っています。

0