JAX-RS选择MediaType

时间:2016-05-19 21:22:02

标签: java jax-rs

我正在尝试使用JAX-RS创建下载服务。为此,我添加了带有文件名的HTTP标头Content-Disposition。在JAX-RS中,我希望尽可能多地重用,并且我想检测“选定”响应MediaType。 e.g。

@Path("/download")
public class DownloadResource {
    @GET
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public Response download() {
        return Response.ok(new SomeContent())
            // Detect MediaType to decide which file extension has to be used
            .addHeader("Content-Disposition", "attachment; filename=\"download.?\"")
            .build();
    }
}

我希望有Content-Disposition标头提供xml或json作为下载(仅适用于此示例)。但不知何故,我需要知道首选的MediaType是JAX-RS(在这种情况下是XML或JSON)。

更新:进一步研究后,使用Filter会更有意义。我更新了这样的代码:

@Path("/download")
public class DownloadResource {
    @GET
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    @Attachment
    public Response download() {
        return Response.ok()
                .entity(new SomeContent())
                .build();
    }
}

我在这里添加了@Attachment注释。它的定义:

@Retention(RetentionPolicy.RUNTIME)
public @interface Attachment {

}

应添加Content-Disposition标题的过滤器。

public class AttachmentResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext)
        throws IOException {
            MediaType responseMediaType = responseContext.getMediaType();

            if (responseMediaType instanceof MediaType) {
                String fileExtension = ...; // Has to be build
                responseContext.getHeaders().add("Content-Disposition",
                        "attachment; filename=\"" + "file." + fileExtension + "\""
                );
            }
    }

最后添加注册过滤器到FeatureContext

@Provider
public class AttachmentFeature implements DynamicFeature {

    @Override
    public void configure(ResourceInfo resourceInfo, FeatureContext context) {
        Attachment attachment = resourceInfo.getResourceMethod().getAnnotation(Attachment.class);

        if (attachment instanceof Attachment) {
            context.register(AttachmentResponseFilter.class);
        }
    }

}

我必须考虑的一件事是如何在AttachmentResponseFilter中生成自定义文件名,而不是固定的“文件”。串。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我会通过HttpServletRequest注入@Context。要确定JAX-RS将选择哪种格式,您需要查看"接受"标题来自request.getHeader("Accept")。您的浏览器几乎可以使用任何内容。但是REST客户端通常会创建一个标题,例如" Accept:application / json"或类似的东西。

JAX-RS将为您完成这项工作。当您指出时,JAX-RS请求可以为您提供此信息。

我不得不问 - 你为什么关心? JAX-RS的一个要点是向您隐藏它 - 返回您的对象并让其他东西为您序列化。