オブジェクトをクラスリソースの場所にキャッシュするために、次のように作成しました。
static private <T> void toSerializedCache(Class<T> cls, T t, String cachecrlstr) {
try {
URL crl = cls.getResource(cachecrlstr);
File crf = new File(crl.getFile());
JAXBContext jaxbContext = JAXBContext.newInstance(cls);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(t, crf);
}
catch (Exception e) {
System.out.printf("Failed to write %s to cache %s", t.getClass(), cachecrlstr);
}
}
問題は、cachecrlstr が最初は存在しないファイルであることです。ファイルは最初に作成する必要があります。
最初は存在しないため、クラス ローダーは URL を null として返し、手順は失敗します。
このルーチンは、クラスローダーから絶対パスを推測する必要がある Web サービスで実行されるため、絶対パスは使用できません。
この問題を解決するために、ルーチンを次のように書き直します。
static private <T> void toSerializedCache(Class<T> cls, T t, String cachecrlstr) {
try {
File crf = new File(request.getSession().getServletContext().getRealPath("/WEB-INF/class"+cachecrlstr));
JAXBContext jaxbContext = JAXBContext.newInstance(cls);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(t, file);
}
catch (JAXBException e) {
System.out.printf("Failed to write %s to cache %s", t.getClass(), cachecrlstr);
}
}
しかし、このルーチンは jax-rs サービス実装内にあるため、httpservletrequest オブジェクトを取得できません。また、リクエストを Threadlocal マップに格納するための http リスナー (web.xml に登録されているもの) を作成したくありません。(つまり、Threadlocal オブジェクトを維持するのをいじりたくない)。
ただし、(書き込みはしたくありませんが) Threadlocal からオブジェクトを撤回するつもりです。
RestEasy が http オブジェクトを Threadlocal に保存して、セッション コンテキストまたはリクエストを推測するために撤回できるかどうかは誰にもわかりませんか?
WEB-INF/class
より重要な質問は、上で述べた制約の下で、ファイルパスが に対して相対的であるファイルにオブジェクトを書き込むために何をすることをお勧めしますか。