gpt4 book ai didi

java - @Produces 基于条件的注解

转载 作者:行者123 更新时间:2023-12-01 15:16:17 27 4
gpt4 key购买 nike

对于一个新项目,我们在客户端使用 jQuery 组件,其中之一是 blueImp 文件 uploader 。我们愉快地编写代码,在 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 时,我想返回 text/plain (或类似的东西),当用户使用浏览器时,我想返回 application/json ... eeeerrrrm,我的意思是,一些其他浏览器:-)

谢谢!

最佳答案

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

  • 将 @Provider 添加到您的类中,然后添加 @Produces()
  • 实现 MessageBodyWriter 接口(interface),重写必要的方法

我的代码最终是:

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 列表,因为我的用户界面期望如此。顺便说一句,blueImp 文件上传默认情况下是这样的。我们正在 JAX-RS 上进行自动上传,并且硬性限制为 1 个文件,因此我不必处理超过 1 个项目。请注意,重用此代码时,可能需要进行一些调整。

如您所见,这就是我所做的一切,仅此而已。其余的只是默认实现,因为就我而言,我不关心其中的任何一个。

小提示:不要关闭 writer。只需冲洗即可。关闭它会在写入响应之前关闭它。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com