我最终通过编写自己的 Provider 解决了这个问题(这实际上是我在这里提出问题之前开始做的事情)。对于那些感兴趣(但还不知道)的人:编写自己的提供程序涉及 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、大小和名称,以及 getter 和 setter。
我读到返回 text/plain 使 blueImp jQuery Fileupload 起作用,所以这是 UploadResponse 的 text/plain 输出的提供程序。
我在这里所做的是创建一个 JSON 对象,将其放入一个列表中,然后将该列表写入响应。我正在创建一个 UploadResponses 列表,因为我的 UI 期望这样做。blueImp File Upload 期望默认情况下,顺便说一句。我们在 JAX-RS 上进行自动上传,并且硬限制为 1 个文件,因此我不必处理超过 1 个项目。请注意,在重用此代码时,可能需要进行一些调整。
如您所见,这就是我正在做的所有事情,仅此而已。其余的只是默认实现,因为就我而言,我不关心任何一个。
一个小提示:不要关闭作者。冲一下就好了。关闭它将在写入响应之前关闭它。