0

私は Apache Avro を学習しようとしています。Avro の簡単なチュートリアルから始めました。JSON スキーマを使用してデータをロードしようとしています。以下は私の簡単な例です-

public class AvroExample {

    public static Schema SCHEMA; // writer's schema
    public static Schema SCHEMA2; // reader's schema

    private String name;
    private int age;
    private String[] mails;
    private AvroExample boss;

    static {
        try {

            SCHEMA = Schema.parse(AvroExample.class.getResourceAsStream("Employee.avsc"));
            SCHEMA2 = Schema.parse(AvroExample.class.getResourceAsStream("Employee2.avsc"));
        } catch (Exception e) {
            System.out.println("Couldn't load a schema: " + e.getMessage());
        }
    }

    // some more code

}

しかし、どういうわけか、この行は常に私に例外を与えます-

SCHEMA = Schema.parse(AvroExample.class.getResourceAsStream("Employee.avsc"));

なので-Couldn't load a schema: java.lang.NullPointerException

どういうわけか、ファイルを正しくロードできないか、ファイルを間違った方法でロードしていると思います。

これはファイルの内容です-

{
  "type": "record", 
  "name": "Employee", 
  "fields": [
      {"name": "name", "type": "string"},
      {"name": "age", "type": "int"},
      {"name": "emails", "type": {"type": "array", "items": "string"}},
      {"name": "boss", "type": ["Employee","null"]}
  ]
}

以下は、これらの 2 つの avsc ファイルを配置した場所を示すワークスペースの写真です。

ここに画像の説明を入力

誰でもこれで私を助けることができますか?

4

1 に答える 1

1

あなたが私たちに示したプロジェクトのセットアップでは、クラスパスはおそらく次のようになります

/root
    /Employee.avsc
    /Employee2.avsc
    /com
        /rjamal
            /avro
                /test
                    /AvroExperiment
                        /...

つまり、2 つのavscファイルはクラスパスのルートになります。メソッド呼び出し

AvroExample.class.getResourceAsStream("Employee.avsc")

AvroExampleクラスが入っているパッケージ内のリソースを探します。

クラスパスのルートに対して相対的にするには、パスの前に/.

AvroExample.class.getResourceAsStream("/Employee.avsc")

javadocを確認してください

委任の前に、次のアルゴリズムを使用して、指定されたリソース名から絶対リソース名が構築されます。

  • 名前が「/」(「\u002f」) で始まる場合、リソースの絶対名は、「/」に続く名前の部分です。
  • それ以外の場合、絶対名は次の形式になります: modified_pa​​ckage_name/name

    modified_pa​​ckage_name は、 「.」を「/」に置き換えたこのオブジェクトのパッケージ名です。('\u002e')。

鉱山を強調します。

于 2013-09-10T21:01:09.530 に答える