对于一个新项目,我们在客户端使用jQuery组件,其中之一是blueImp文件上传器。我们快乐地编写了代码,一切都在Chrome和Firefox中运行良好……直到有人试图在Internet Explorer中打开该网站。显然,使用此上载组件时,IE无法处理来自服务器的application / json返回-而且,它只是将其作为文件流传输给用户。无论如何,很多用户确实有此问题(在他们的站点上提到了该问题:https://github.com/blueimp/jQuery-File-Upload/wiki/Frequently-Asked-Questions及其错误报告程序的其他地方)

但是,其中提到的大多数变通办法都是基于PHP的。我们在服务器端使用Java,更具体地说:JAX-RS。现在,JAX-RS具有这个可爱的@Produces批注,它是……非常静态的。我一直在仔细阅读文档,但没有一个更明智。有什么办法可以向此@Produces注释添加条件?明确地说:我想在用户使用IE时返回文本/纯文本(或类似的东西),而在用户使用浏览器时返回application / json ... eeeerrrm,我的意思是,某些其他浏览器:-)

谢谢!

最佳答案

我最终通过编写自己的提供程序解决了这个问题(实际上是我在这里提出问题之前开始做的事情)。对于那些感兴趣(但还不知道)的人:编写自己的提供程序涉及两个步骤:


将@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方法。

我读到返回的文本/纯文本使blueImp jQuery Fileupload功能正常运行,因此这是一个UploadResponse的文本/纯文本输出的提供程序。

我在这里要做的是创建一个JSON对象,将其放在列表中,然后将该列表写入响应中。我正在创建一个UploadResponses列表,因为我的UI期望如此。 blueImp文件上载默认情况下需要btw。我们正在JAX-RS上进行自动上传,并且对1个文件进行了硬性限制,因此我不必处理多个项目。请注意,在重用此代码时,可能需要进行一些修改。

如您所见,这就是我正在做的,仅此而已。剩下的只是默认实现,因为就我而言,我一点都不在乎。

一个小注意事项:不要关闭作者。只是冲洗一下。关闭它会在写入响应之前将其关闭。

关于java - @根据条件产生注释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11555544/

10-11 18:53