找不到 MessageBodyWriter 类型的响应对象:com.sun.jersey.api.json.JSONWithPadding 媒体类型:application/x-javascript

Posted

技术标签:

【中文标题】找不到 MessageBodyWriter 类型的响应对象:com.sun.jersey.api.json.JSONWithPadding 媒体类型:application/x-javascript【英文标题】:Could not find MessageBodyWriter for response object of type: com.sun.jersey.api.json.JSONWithPadding of media type: application/x-javascript 【发布时间】:2013-03-15 13:37:42 【问题描述】:

我正在尝试在我的主干应用程序上使用 jsonp。在我的网络服务中,我正在尝试使用 Jersey 库来使用 JSONWithPadding 响应。

问题是,似乎不支持“application/x-javascript”。

我的代码是:

@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);


结果是:

Etat HTTP 500 - 找不到 MessageBodyWriter 类型的响应对象:com.sun.jersey.api.json.JSONWithPadding 媒体类型:application/javascript

有人可以帮我吗?

编辑:完整的堆栈跟踪:

18:52:33,243 警告 [org.jboss.resteasy.core.SynchronousDispatcher] (http--127.0.0.1-8080-1) 执行 GET pp/fn/issues/jsonp 失败: org.jboss.resteasy.core.NoMessageBodyWriterFoundFailure:不能 为类型的响应对象找到 MessageBodyWriter: com.sun.jersey.api.json.JSONWithPadding 媒体类型: 应用程序/x-javascript 在 org.jboss.resteasy.core.ServerResponse.writeTo(ServerResponse.java:216) [resteasy-jaxrs-2.3.2.Final.jar:] 在 org.jboss.resteasy.core.SynchronousDispatcher.writeJaxrsResponse(SynchronousDispatcher.java:585) [resteasy-jaxrs-2.3.2.Final.jar:] 在 org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:506) [resteasy-jaxrs-2.3.2.Final.jar:] 在 org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119) [resteasy-jaxrs-2.3.2.Final.jar:] 在 org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.3.2.Final.jar:] 在 org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55) [resteasy-jaxrs-2.3.2.Final.jar:] 在 org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50) [resteasy-jaxrs-2.3.2.Final.jar:] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.0.Final.jar:1.0.0.Final] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:] 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:] 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:] 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:489) [jbossweb-7.0.13.Final.jar:] 在 org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:50) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final] 在 org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:] 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:] 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:] 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:] 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:] 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:] 在 java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_11]

艾伦

【问题讨论】:

你能提供整个堆栈跟踪吗? 【参考方案1】:

根据堆栈跟踪,JBoss 中提供的 Resteasy 似乎无法从 jersey-json.jar 中找到 JSONWithPaddingProvider,您(我想)捆绑在您的 WAR 中。 JSONWithPadding 是 Jersey 特定的类,如果你想使用它,你有 2 个选项:

将 Jersey 库添加到您的 WAR(如果您还没有它们)并按照 Deploying a Jersey webapp on Jboss AS 7 中的说明在 web.xml 中禁用 Resteasy,以确保您的应用程序使用 Jersey 作为 JAX-RS 实现 将jersey-json.jar 添加到JBoss 类路径,以便Resteasy 能够在此jar 中找到MessageBodyWriter (JSONWithPaddingProvider)

【讨论】:

【参考方案2】:

RestEasy 也已经有了JacksonJsonpInterceptor - 如果您正在使用带有 RestEasy 的 Guice,您可以在适当的模块中使用 bind(JacksonJsonpInterceptor.class),否则您应该为 RestEasy 正常配置它(参见 https://docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/Interceptors.html 第 29.6 节):

它们可以在 web.xml 中的 resteasy.providers 上下文参数中列出,或者在 Application.getClasses() 或 Appication.getSingletons() 方法中作为类或对象返回。

【讨论】:

以上是关于找不到 MessageBodyWriter 类型的响应对象:com.sun.jersey.api.json.JSONWithPadding 媒体类型:application/x-javascript的主要内容,如果未能解决你的问题,请参考以下文章

泽西岛:找不到媒体类型 = 应用程序/json、类型 = 类 org.codehaus.jackson.node.ObjectNode 的 MessageBodyWriter?

找不到 MessageBodyWriter 类型的响应对象:com.sun.jersey.api.json.JSONWithPadding 媒体类型:application/x-javascript

严重:找不到媒体类型 = 应用程序/json、类型 = 类 com.jersey.jaxb.Todo、通用类型 = 类 com.jersey.jaxb.Todo 的 MessageBodyWriter

找不到MessageBodyWriter,从fatjar运行时出错

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException:找不到媒体类型的 MessageBodyWrite

Jersey REST (GET) throwing MessageBodyWriter not found for media type=application/xml