Java 将JSONWithPadding(Jersey)与其他mime类型一起使用
当使用Jersey和JSONWithPadding和Accept标头时,我在使用此标头发出请求时遇到问题 接受:应用程序/vnd foo.bar+javascript(应返回jsonp) 我得到了以下信息: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
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
的JSONPMessageBodyWriter
。不幸的是,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
的JSONPMessageBodyWriter
。不幸的是,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
的JSONPMessageBodyWriter
。不幸的是,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);
}
}
这很简单;-)谢谢这很容易;-)谢谢这很容易;-)谢谢这很容易;-)谢谢