3
votes

I'm trying to use jsonp on my backbone application. In my webservice, I'm trying to use the Jersey library to use the JSONWithPadding response.

Problem is, looks like the "application/x-javascript" is not supported.

My code is :

@GET
@Path("/issues/jsonp")
@Produces("application/x-javascript")
public JSONWithPadding getIssuesJsonp(@Context HttpServletRequest req,
    @PathParam("ppid") String qppid,
    @QueryParam("callback") String callback) {

Principal principal = req.getUserPrincipal();
    String username = principal.getName();

try {
    List<IssueDTO> list = service.getIssuesDTO(username, qppid);
    IssuesResult r = new IssuesResult();
    r.setIssues(list);
    System.out.println("CALLBACK:" + callback);
    return new JSONWithPadding(r,callback);
} catch (Exception e) {
    String message = "Internal Server Error";
    LOG.error(message, e);
    Result r = new Result(PPStatusCode.INTERNAL_SERVER_ERROR, message);
    return new JSONWithPadding(noCache(500, r),callback);
}
}

And the result is:

Etat HTTP 500 - Could not find MessageBodyWriter for response object of type: com.sun.jersey.api.json.JSONWithPadding of media type: application/javascript

Can someone help me ?

Edit: the full stacktrace:

18:52:33,243 WARN [org.jboss.resteasy.core.SynchronousDispatcher] (http--127.0.0.1-8080-1) Failed executing GET pp/fn/issues/jsonp: org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure: Could not find MessageBodyWriter for response object of type: com.sun.jersey.api.json.JSONWithPadding of media type: application/x-javascript at org.jboss.resteasy.core.ServerResponse.writeTo(ServerResponse.java:216) [resteasy-jaxrs-2.3.2.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.writeJaxrsResponse(SynchronousDispatcher.java:585) [resteasy-jaxrs-2.3.2.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:506) [resteasy-jaxrs-2.3.2.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119) [resteasy-jaxrs-2.3.2.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.3.2.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) [resteasy-jaxrs-2.3.2.Final.jar:] at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) [resteasy-jaxrs-2.3.2.Final.jar:] at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:489) [jbossweb-7.0.13.Final.jar:] at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:] at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_11]

Alan

2
Can you provide whole stacktrace?Michal Gajdos

2 Answers

1
votes

Based on the stacktrace it looks like Resteasy provided in JBoss is unable to find JSONWithPaddingProvider from jersey-json.jar which you have (I suppose) bundled in your WAR. JSONWithPadding is Jersey specific class and if you want to use it you have 2 options:

  • add Jersey libs to your WAR (if you don't have them there already) and disable Resteasy in web.xml as described in Deploying a Jersey webapp on Jboss AS 7 to make sure your application uses Jersey as JAX-RS implementation
  • add jersey-json.jar to the JBoss classpath so Resteasy is able to find MessageBodyWriter (JSONWithPaddingProvider) located in this jar
0
votes

RestEasy also has the JacksonJsonpInterceptor already - if you are using Guice with RestEasy, you can bind(JacksonJsonpInterceptor.class) in an appropriate module, otherwise you will should configure it as normal for RestEasy (see https://docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/Interceptors.html section 29.6):

they can be listed in the resteasy.providers context-param in web.xml or returned as a class or object in the Application.getClasses() or Appication.getSingletons() method.