Java 将JSONWithPadding(Jersey)与其他mime类型一起使用

Java 将JSONWithPadding(Jersey)与其他mime类型一起使用,java,jersey,jax-rs,Java,Jersey,Jax Rs,当使用Jersey和JSONWithPadding和Accept标头时,我在使用此标头发出请求时遇到问题 接受:应用程序/vnd foo.bar+javascript(应返回jsonp) 我得到了以下信息: Feb 05, 2014 11:46:29 AM com.sun.jersey.json.impl.provider.entity.JSONWithPaddingProvider writeTo SEVERE: A message body writer for Java type, [co

当使用Jersey和JSONWithPadding和Accept标头时,我在使用此标头发出请求时遇到问题

接受:应用程序/vnd foo.bar+javascript(应返回jsonp)

我得到了以下信息:

Feb 05, 2014 11:46:29 AM com.sun.jersey.json.impl.provider.entity.JSONWithPaddingProvider writeTo
SEVERE: A message body writer for Java type, [com.example.SomeEntity@4fc0e1e3], and MIME media type, application/vnd-foo.bar+javascript; charset=UTF-8, was not found.
使用以下标题发出请求就可以了

接受:应用程序/json(返回json)
接受:应用程序/vnd foo.bar+json(返回json)
接受:应用程序/javascript(返回jsonp)

我没有显式地配置服务来处理application/vnd foo.bar+json-like-application/json,所以我希望application/vnd foo.bar+javascript像application/javascript一样处理

@GET
@Produces({ "application/json", "application/vnd-foo.bar+json", "application/javascript",
    "application/vnd-foo.bar+javascript" })
public JSONWithPadding get(@QueryParam("callback") String callback) {
    return new JSONWithPadding(someListOfObjects, callback);
}

关于如何让application/vnd foo.bar+javascript像application/javascript一样处理,您有什么想法吗?

在这种情况下,您需要从Jersey 1扩展JSONP
MessageBodyWriter
调用
JSONWithPaddingProvider
。不幸的是,
JSONWithPaddingProvider#isJavascript()
是私有的,否则会更容易:

@Provider
public class CustomJSONWithPaddingProvider extends JSONWithPaddingProvider {

    @Override
    public void writeTo(final JSONWithPadding t,
                        final Class<?> type,
                        final Type genericType,
                        final Annotation[] annotations,
                        final MediaType mediaType,
                        final MultivaluedMap<String, Object> httpHeaders,
                        final OutputStream entityStream)
            throws IOException, WebApplicationException {

        final boolean isJavascript = mediaType
                .getSubtype().endsWith("+javascript");
        final MediaType mt = isJavascript ?
                new MediaType("application", "javascript") : mediaType;

        super.writeTo(t, type, genericType, annotations, mt, httpHeaders, entityStream);
    }
}
@Provider
公共类CustomJSONWithPaddingProvider扩展了JSONWithPaddingProvider{
@凌驾
公共无效写入(最终JSONT,
最后的班级类型,
最终类型genericType,
最终注释[]注释,
最终MediaType MediaType,
最终多值MAP HttpHeader,
最终输出流(实体流)
抛出IOException、WebApplicationException{
最终布尔值isJavascript=mediaType
.getSubtype().endsWith(“+javascript”);
最终MediaType mt=isJavascript?
新的MediaType(“应用程序”、“javascript”):MediaType;
super.writeTo(t,type,genericType,annotation,mt,httpHeaders,entityStream);
}
}

在这种情况下,您需要从Jersey 1扩展名为
JSONWithPaddingProvider
的JSONP
MessageBodyWriter
。不幸的是,
JSONWithPaddingProvider#isJavascript()
是私有的,否则会更容易:

@Provider
public class CustomJSONWithPaddingProvider extends JSONWithPaddingProvider {

    @Override
    public void writeTo(final JSONWithPadding t,
                        final Class<?> type,
                        final Type genericType,
                        final Annotation[] annotations,
                        final MediaType mediaType,
                        final MultivaluedMap<String, Object> httpHeaders,
                        final OutputStream entityStream)
            throws IOException, WebApplicationException {

        final boolean isJavascript = mediaType
                .getSubtype().endsWith("+javascript");
        final MediaType mt = isJavascript ?
                new MediaType("application", "javascript") : mediaType;

        super.writeTo(t, type, genericType, annotations, mt, httpHeaders, entityStream);
    }
}
@Provider
公共类CustomJSONWithPaddingProvider扩展了JSONWithPaddingProvider{
@凌驾
公共无效写入(最终JSONT,
最后的班级类型,
最终类型genericType,
最终注释[]注释,
最终MediaType MediaType,
最终多值MAP HttpHeader,
最终输出流(实体流)
抛出IOException、WebApplicationException{
最终布尔值isJavascript=mediaType
.getSubtype().endsWith(“+javascript”);
最终MediaType mt=isJavascript?
新的MediaType(“应用程序”、“javascript”):MediaType;
super.writeTo(t,type,genericType,annotation,mt,httpHeaders,entityStream);
}
}

在这种情况下,您需要从Jersey 1扩展名为
JSONWithPaddingProvider
的JSONP
MessageBodyWriter
。不幸的是,
JSONWithPaddingProvider#isJavascript()
是私有的,否则会更容易:

@Provider
public class CustomJSONWithPaddingProvider extends JSONWithPaddingProvider {

    @Override
    public void writeTo(final JSONWithPadding t,
                        final Class<?> type,
                        final Type genericType,
                        final Annotation[] annotations,
                        final MediaType mediaType,
                        final MultivaluedMap<String, Object> httpHeaders,
                        final OutputStream entityStream)
            throws IOException, WebApplicationException {

        final boolean isJavascript = mediaType
                .getSubtype().endsWith("+javascript");
        final MediaType mt = isJavascript ?
                new MediaType("application", "javascript") : mediaType;

        super.writeTo(t, type, genericType, annotations, mt, httpHeaders, entityStream);
    }
}
@Provider
公共类CustomJSONWithPaddingProvider扩展了JSONWithPaddingProvider{
@凌驾
公共无效写入(最终JSONT,
最后的班级类型,
最终类型genericType,
最终注释[]注释,
最终MediaType MediaType,
最终多值MAP HttpHeader,
最终输出流(实体流)
抛出IOException、WebApplicationException{
最终布尔值isJavascript=mediaType
.getSubtype().endsWith(“+javascript”);
最终MediaType mt=isJavascript?
新的MediaType(“应用程序”、“javascript”):MediaType;
super.writeTo(t,type,genericType,annotation,mt,httpHeaders,entityStream);
}
}

在这种情况下,您需要从Jersey 1扩展名为
JSONWithPaddingProvider
的JSONP
MessageBodyWriter
。不幸的是,
JSONWithPaddingProvider#isJavascript()
是私有的,否则会更容易:

@Provider
public class CustomJSONWithPaddingProvider extends JSONWithPaddingProvider {

    @Override
    public void writeTo(final JSONWithPadding t,
                        final Class<?> type,
                        final Type genericType,
                        final Annotation[] annotations,
                        final MediaType mediaType,
                        final MultivaluedMap<String, Object> httpHeaders,
                        final OutputStream entityStream)
            throws IOException, WebApplicationException {

        final boolean isJavascript = mediaType
                .getSubtype().endsWith("+javascript");
        final MediaType mt = isJavascript ?
                new MediaType("application", "javascript") : mediaType;

        super.writeTo(t, type, genericType, annotations, mt, httpHeaders, entityStream);
    }
}
@Provider
公共类CustomJSONWithPaddingProvider扩展了JSONWithPaddingProvider{
@凌驾
公共无效写入(最终JSONT,
最后的班级类型,
最终类型genericType,
最终注释[]注释,
最终MediaType MediaType,
最终多值MAP HttpHeader,
最终输出流(实体流)
抛出IOException、WebApplicationException{
最终布尔值isJavascript=mediaType
.getSubtype().endsWith(“+javascript”);
最终MediaType mt=isJavascript?
新的MediaType(“应用程序”、“javascript”):MediaType;
super.writeTo(t,type,genericType,annotation,mt,httpHeaders,entityStream);
}
}
这很简单;-)谢谢这很容易;-)谢谢这很容易;-)谢谢这很容易;-)谢谢