2014-02-05 22 views
0

當使用新澤西州和JSONWithPadding與Accept報頭我在發出請求與此頭使用JSONWithPadding(新澤西州)以替代mime類型

接受問題:應用/ 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, [[email protected]], 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像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一樣處理的任何想法?

回答

3

在這種情況下,你需要擴展JSONP MessageBodyWriter稱爲澤西1 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); 
    } 
} 
+0

這是很容易的;-)謝謝! – Simon

相關問題