web-dev-qa-db-ja.com

Spring Bootのリソースフォルダーからファイルを読み取る

私はSpring Bootとjson-schema-validatorを使用しています。 resourcesフォルダーからjsonschema.jsonというファイルを読み取ろうとしています。いくつかの異なる方法を試してみましたが、動作させることができません。これは私のコードです。

ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);

これはファイルの場所です。

enter image description here

そして、ここでclassesフォルダー内のファイルを見ることができます。

enter image description here

しかし、コードを実行すると、次のエラーが発生します。

jsonSchemaValidator error: Java.io.FileNotFoundException: /home/user/Dev/Java/Java%20Programs/SystemRoutines/target/classes/jsonschema.json (No such file or directory)

私のコードで間違っているのは何ですか?

39
g3blv

この問題を解決するために多くの時間を費やした後、最終的に機能する解決策を見つけました。このソリューションは、SpringのResourceUtilsを利用しています。 JSONファイルでも機能するはずです。

Lokesh Guptaによるよく書かれたページをありがとう: Blog

enter image description here

package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;

import Java.io.FileInputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.util.Properties;
import Java.io.File;


public class Utils {

    private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());

    public static Properties fetchProperties(){
        Properties properties = new Properties();
        try {
            File file = ResourceUtils.getFile("classpath:application.properties");
            InputStream in = new FileInputStream(file);
            properties.load(in);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
        return properties;
    }
}

コメントに関するいくつかの懸念に答えるには:

Java -jar target/image-service-slave-1.0-SNAPSHOT.jarを使用してAmazon EC2でこれを実行していることを確認してください。私のgithubリポジトリを見てください: https://github.com/ johnsanthosh/image-service を使用して、JARからこれを実行する正しい方法を見つけます。

59
John

非常に短い答え:ターゲットクラスではなく、特定のクラスローダーのスコープでプロパティを探しています。これは動作するはずです:

File file = new File(getClass().getResource("jsonschema.json").getFile());
JsonNode mySchema = JsonLoader.fromFile(file);

また、これを参照してください:

追伸プロジェクトが1台のマシンでコンパイルされ、その後別のマシンで起動された場合、またはDockerでアプリを実行した場合に問題が発生する可能性があります。この場合、リソースフォルダーへのパスが無効になる可能性があります。この場合、実行時にリソースへのパスを決定することをお勧めします。

ClassPathResource res = new ClassPathResource("jsonschema.json");    
File file = new File(res.getPath());
JsonNode mySchema = JsonLoader.fromFile(file);
16

たとえば、Resourcesフォルダの下にconfigフォルダがある場合、このクラスが完全に機能することを試みました

File file = ResourceUtils.getFile("classpath:config/sample.txt")

//Read File Content
String content = new String(Files.readAllBytes(file.toPath()));
System.out.println(content);
10
Ismail

リソースにjsonフォルダーをサブフォルダーとして作成し、jsonファイルをフォルダーに追加すると、このコードを使用できます: enter image description here

import com.fasterxml.jackson.core.type.TypeReference;

InputStream is = TypeReference.class.getResourceAsStream("/json/fcmgoogletoken.json");

これはDockerで機能します。

4

これが私の解決策です。誰かを助けるかもしれません。

InputStreamを返しますが、あなたもそれを読むことができると思います。

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("jsonschema.json");
2
Erçin Akçay

同じ問題で立ち往生しているこれは私を助けます

URL resource = getClass().getClassLoader().getResource("jsonschema.json");
JsonNode jsonNode = JsonLoader.fromURL(resource);
1
Govind Singh

ここで私の答えを参照してください: https://stackoverflow.com/a/56854431/4453282

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

これらの2つのインポートを使用します。

宣言する

@Autowired
ResourceLoader resourceLoader;

これを何らかの機能で使用する

Resource resource=resourceLoader.getResource("classpath:preferences.json");

あなたの場合、あなたがファイルを必要とするとき、あなたは以下を使うかもしれません

File file = resource.getFile()

参照: http://frugalisminds.com/spring/load-file-classpath-spring-boot/ 前の回答ですでに述べたように、ResourceUtilsを使用しないでください。JARのデプロイ後は機能しません。これはIDEで動作するだけでなく、展開後も動作します

0
sajal rajabhoj