私は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();
Springタイプ ClassPathResource を使用するだけです。
File file = new ClassPathResource("countries.xml").getFile();
このファイルがクラスパスのどこかにある限り、Springはそれを見つけます。これは、開発およびテスト中にsrc/main/resources
になる場合があります。本番環境では、現在の実行ディレクトリにすることができます。
Spring Bootアプリケーションを使用しているときに、resource.getFile()
を使用してクラスパスリソースを取得することは、同じ問題に直面したため、JARとしてデプロイするのは困難です。このスキャンは、クラスパス内の任意の場所に配置されているすべてのリソースを見つけるStreamを使用して解決されます。
以下は同じコードスニペットです-
ClassPathResource classPathResource = new ClassPathResource("fileName");
InputStream inputStream = classPathResource.getInputStream();
content = IOUtils.toString(inputStream);
クラスパスのファイルを取得するには:
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ファイルを読み取るための 小規模な例 を次に示します。
次のコードを使用して、リソースフォルダーから文字列のファイルを読み取ることができます。
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();
}
私はスプリングブーツを使用しているので、簡単に使用できます:
File file = ResourceUtils.getFile("classpath:myfile.xml");
次の構成を使用する必要があります
InputStream in = getClass().getResourceAsStream("/yourFile");
ファイル名の前にこのスラッシュを追加する必要があることに注意してください。
私はSpring Bootを使用していますが、問題の解決策は
"src/main/resources/myfile.extension"
それが誰かを助けることを願っています。