Glassfish:泽西客户端中的MessageBodyProviderNotFoundException

Posted

技术标签:

【中文标题】Glassfish:泽西客户端中的MessageBodyProviderNotFoundException【英文标题】:Glassfish :MessageBodyProviderNotFoundException in Jersy Client 【发布时间】:2015-01-12 17:55:41 【问题描述】:

大家好,我试图从头开始创建一个休息网络服务。这是我的服务部分

@Path("/Phones")
public class PhonessResource 

 @GET
 @Produces(MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON)
  public Response getAllNumbers()
      List<PhoneDetail> list = PhoneDirectoryDao.getInstance().getAllNumbers();
      GenericEntity<List<PhoneDetail>> entity = new GenericEntity<List<PhoneDetail>>(list) ;
      Response response =Response.ok(entity).status(200).build();
      return response;//PhoneDirectoryDao.getInstance().getAllNumbers();
    
 

我的数据模型:我有我的 getter 和 setter 以及另一个获取所有属性的构造函数,我没有将它粘贴到更短的问题长度,我在客户端和服务器中使用相同的数据模型

@XmlRootElement(name="PhoneDetail")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder="id","firstName","lastName","address","phoneNo","timeStamp")
public class PhoneDetail 

    private int id;
    private String firstName;
    private String lastName;
    private String address;
    private String phoneNo;
    private Timestamp timeStamp;

    public PhoneDetail() 

然后我创建一个 java 客户端来测试服务。我使用的是 NETBEANS IDE,所以我在 IDE 中选择默认选项来创建它

因此我创建了一个 Jersey 客户端

public class PhoneCLient 
    private WebTarget webTarget;
    private Client client;
    private static final String BASE_URI = "http://localhost:8080/Phones/webresources";

    public PhoneCLient() 
        client = javax.ws.rs.client.ClientBuilder.newClient();
        webTarget = client.target(BASE_URI).path("Items");
    


    public <T> T getAllNumbers_XML(Class<T> responseType) throws ClientErrorException 
        WebTarget resource = webTarget;
        return resource.request(javax.ws.rs.core.MediaType.APPLICATION_XML).get(responseType);
    

    public <T> T getAllNumbers_JSON(Class<T> responseType) throws ClientErrorException 
        WebTarget resource = webTarget;
        return resource.request(javax.ws.rs.core.MediaType.APPLICATION_JSON).get(responseType);
    

但它给了我这个错误

Exception in thread "main" org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/xml, type=class org.glassfish.jersey.client.ClientResponse, genericType=class org.glassfish.jersey.client.ClientResponse.
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:173)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:134)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:988)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:833)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:768)
    at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:96)
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:740)
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:88)
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:650)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:421)
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:646)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:375)
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:275)
    at PhoneDirectoryClient.rest.PhoneCLient.getAllNumbers_XML(PhoneCLient.java:45)

但是当我在 Browser 或 RestClient Browser 插件中测试服务时,它工作正常。 谁能告诉我出了什么问题??

【问题讨论】:

【参考方案1】:

对于 Xml,如果您拥有 Jersey 附带的所有依赖项,那么它应该可以满足客户端 API 的要求。您可能没有添加所有这些。我看到您没有使用 Maven,我强烈建议您这样做。但我会提供两种方法来处理这个问题。

XML

Maven:

只有依赖项才能启动和运行客户端(支持 JAXB xml)

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.13</version>
</dependency>

没有变得更简单:-)

非 Maven:

所以使用 Maven 项目,我添加了上述依赖项,这些都是它引入的所有传递依赖项。在您的非 Maven 项目中,您将需要手动添加所有这些 jar。

如果你去Jersey Hompage,去下载,然后下载“Jersey JAX-RS 2.0 RI bundle。你应该在那里找到所有这些依赖项。你应该将所有需要的依赖项添加到你的项目中

注意:Netbeans 已经带有Jersey 2.0 (JAX-RS RI) 库。相反,您可以简单地将该库添加到您的项目中。只需右键单击项目中的 [Libraries] 节点,然后选择 [Add Library]。您应该在对话框中看到 Jersey。这个解决方案可能是最简单的,但它会导入所有 Jersey 依赖项,比客户端 API 所需的要多

JSON

JSON 需要另一个依赖项:

Maven:

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.13</version>
</dependency>

非 Maven

查看this post 获取图片和进一步说明。


只要在类路径上有这些依赖项就可以工作,无需任何特殊配置。

更新

在较新版本的 Jersey 客户端中,jersey-media-jaxb 不再被引入,您需要手动添加它以支持 XML/JAXB。

【讨论】:

实际上所有这些 jars 都存在于我的 Java 客户端中,实际上我只是为客户端手动编写代码,而不使用 Netbeans 内置功能,它开始工作。感谢您的 Maven 和 json 提示 更新:jersey-media-jackson 不再可用,取而代之的是jersey-media-json-jackson @MohamedAliRACHID 它从来没有可用。这是一个错字。谢谢。

以上是关于Glassfish:泽西客户端中的MessageBodyProviderNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.NoSuchMethodError: org.glassfish.hk2.api.ServiceLocatorFactory.creat - 泽西岛

泽西岛日志过滤器的 Maven 依赖项

在Linux上从泽西返回Json引发异常

泽西客户端在Weblogic中运行403但是可以 独立运行

泽西图像上传客户端

泽西客户端多部分通话