我通过编写我自己的提供者(实际上是我在这里问这个问题之前开始做的事)来事后解决了这个问题。对于那些有兴趣(和现在还不知道):写自己的供应商包括两个步骤:
- 加入@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。
我读过返回的文本/ plain使得blueImp jQuery Fileupload正常运行,所以这是一个用于UploadResponse的text/plain输出的Provider。
我在这里做的是创建一个JSON对象,把它放在一个列表中,并将该列表写入响应。我正在创建一个UploadResponses列表,因为我的UI期望。 blueImp文件上传预计,默认情况下,BTW。我们在JAX-RS上进行自动上传,并对1个文件进行硬性限制,所以我不必处理超过1个项目。在重新使用这些代码时要小心,它可能需要一些修改。
正如你所看到的,这就是我所做的一切,没有更多。其余的只是默认实现,因为在我的情况下,我不关心任何它。
小记:请勿关闭作者。只需冲洗它。在写入回复之前,关闭它将关闭它。
也许一个servlet过滤器可以改变IE的Accept头,然后JAX-RS可以在那里发送?或者为IE截取并重写JAX-RS输出的过滤器? – Thilo 2012-07-19 07:07:43
您还可以通过diff @produces拥有两种不同的方法,然后解析为相同的方法。 – 2012-07-19 07:10:12
哇,快速的答复,谢谢:-) @Thilo:接缝是可行的,虽然我真的不喜欢重写过滤器中的响应。但它似乎是需要考虑的事情。谢谢! – gjoris 2012-07-19 07:16:51