改变@Produces(...)在泽西岛生产的东西?

时间:2014-04-24 19:13:09

标签: java json jersey content-type

我是泽西的新手,想改变以下内容:

@Produces(MediaType.APPLICATION_JSON)

我最终要做的是确保响应的字符编码设置为UTF-8。如果我在生成json的每个方法上执行此操作,我可以根据具体情况执行此操作。

@Produces("application/json;charset=UTF-8")

我当然希望在我的应用程序中执行此操作,并让它随处可用。我的第一个想法是implement a java filter来修改它,我无法让它工作。

编辑:所以要100%明确 - 我想在我的应用程序中以某种全球方式执行此操作,并且它会影响Jersey生成的所有输出,无论我在哪里我的代码中@Produces(MediaType.APPLICATION_JSON)。因此,如果我有100个方法对它们有@Produces(MediaType.APPLICATION_JSON),那么突然100个方法现在将使用UTF-8编码内容进行发送。

那么我还能替换@Produces(MediaType.APPLICATION_JSON)产生的东西吗?如果它不是最终的,我只需将MediaType.APPLICATION_JSON更改为我的新值; - )

2 个答案:

答案 0 :(得分:1)

您可以将此作为ContainerResponseFilter来实现,以便在您感兴趣的特定情况下覆盖@Produces注释的行为。

@Provider
@Priority(Priorities.HEADER_DECORATOR)
public class MediaTypeFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        for (Annotation annotation : responseContext.getEntityAnnotations()) {
            filterProducesAnnotation(annotation, responseContext);
        }
    }

    private void filterProducesAnnotation(Annotation annotation, ContainerResponseContext responseContext) {
        if (annotation instanceof Produces) {
            Produces produces = (Produces) annotation;
            filterMediaTypes(produces, responseContext);
        }
    }

    private void filterMediaTypes(Produces produces, ContainerResponseContext responseContext) {
        List<Object> mediaTypes = new ArrayList<Object>();
        for (String mediaType : produces.value()) {
            contentTypes.add(mediaType.equals(MediaType.APPLICATION_JSON) ? mediaType + ";charset=UTF-8" : mediaType);
        }
        responseContext.getHeaders().put("Content-Type", mediaTypes);
    }
}

只需确保在泽西应用程序中注册MediaTypeFilter

答案 1 :(得分:0)

我认为没有default media type具有您想要的字符编码。

虽然过滤器的替代方法可能是引入包含所需mimetype +字符编码的常量。所以简单如下:

private static final String APPLICATION_JSON_UTF8 = MediaType.APPLICATION_JSON + ";charset=UTF-8";

这样做的唯一原因是&#34; application / json; charset = UTF-8&#34;不会将您的代码作为纯文本进行污染(想象一下,如果您需要使用&#39;魔术字符串更改字符编码,那么无处不在:))