私は最終的に自分のプロバイダーを作成することで問題を解決しました(これは実際、ここで質問する前に始めたものです)。興味のある人(そしてまだ知らない人)のために:あなた自身のプロバイダーを書くことは2つのステップを含みます:
- @Providerをクラスに追加してから、@ Produces()
- MessageBodyWriterインターフェースを実装し、必要なメソッドをオーバーライドします
私のコードは次のようになりました:
package com.mypackage;
import com.google.common.collect.Lists;
import com.google.gson.Gson;
import com.mypackage.UploadResponse;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
@Produces("text/plain")
@Provider
public class UploadResponseProvider implements MessageBodyWriter<UploadResponse> {
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
/* You could check the type here, or do some additional checks, but I can just return true, because if it is an UploadResponse (which is inferred via the generic), it's all ok */
return true;
}
@Override
public long getSize(UploadResponse uploadResponse, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return -1;
}
@Override
public void writeTo(UploadResponse uploadResponse, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
OutputStreamWriter writer = new OutputStreamWriter(entityStream);
writer.write(new Gson().toJson(Lists.newArrayList(uploadResponse)));
writer.flush();
}
}
このコードを少し説明すると、UploadResponseが返されるオブジェクトです。これは単純なPOJOであり、フィールドurl、size、nameがあり、getterとsetterがあります。
text / plainを返すと、blueImp jQuery Fileuploadが機能するようになることを読みました。したがって、これは、UploadResponseのtext/plain出力のプロバイダーです。
ここで行うのは、JSONオブジェクトを作成し、それをリストに入れて、そのリストを応答に書き込むことです。私のUIはそれを期待しているので、UploadResponsesのリストを作成しています。blueImp File Uploadは、デフォルトでそれを想定しています。JAX-RSで自動アップロードを行っており、1つのファイルにハード制限しているため、複数のアイテムを処理する必要はありません。このコードを再利用するときは、いくつかの調整が必要になる場合があることに注意してください。
ご覧のとおり、私がしているのはそれだけです。私の場合、私はそれを気にしないので、残りは単なるデフォルトの実装です。
小さなメモ:ライターを閉じないでください。フラッシュするだけです。閉じると、応答に書き込む前に閉じます。