当前位置: 首页 > 知识库问答 >
问题:

如何使用Jackson修复MessageBodyProviderNotFound异常与泽西客户端?

后化
2023-03-14

我已经用Jersey设置了一个使用JSON的REST客户端。首先是根据巴尔东和莫西的指导,其次是根据瓦丁和杰克逊的指导。

来自REST服务的JSON响应如下所示:

{
    "DisplayName": "Sixpack, Joe",
    "UserID": "joe.sixpack",
    "StdLog": "Some text"
}

所以我建立了一个简单的JAXB bean。。。

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class DisplayName {
    private String displayName;
    private String userID;
    private String stdLog;
    public DisplayName() {
    }

    public DisplayName(String DisplayName, String UserID, String StdLog) {
        this.displayName = DisplayName;
        this.userID = UserID;
        this.stdLog = StdLog;
    }

    public String getDisplayName() {
        return displayName;
    }

    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public String getUserID() {
        return userID;
    }

    public void setUserID(String userID) {
        this.userID = userID;
    }

    public String getStdLog() {
        return stdLog;
    }

    public void setStdLog(String stdLog) {
        this.stdLog = stdLog;
    }
}

... 添加了Maven依赖项。。。

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.22.2</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.13</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.9.5</version>
</dependency>

... 并实现了一个REST客户端:

Client client = ClientBuilder.newClient();
        URI uri = UriBuilder.fromUri("http://server:2000").path("/path/to/service/" + UriComponent.encode(input_parameter, UriComponent.Type.QUERY_PARAM_SPACE_ENCODED)).build();
        WebTarget target = client.target(uri);
        DisplayName responseDN = target.request(MediaType.APPLICATION_JSON).accept(MediaType.APPLICATION_JSON).get(DisplayName.class);

然而,当使用MOXy媒体转换器时,所有POJO字段始终为空,而不管根据类似问题使用的注释和构造函数(例如no-args构造函数)(例如JAX-RS响应对象将Object字段显示为NULL值,JavaREST服务接受POJO,但字段始终为空)。

所以我想使用Jackson并改编了JAXB类...

import com.fasterxml.jackson.annotation.*;

@JsonInclude(JsonInclude.Include.ALWAYS)
@JsonPropertyOrder({"DisplayName","UserID","StdLog"})
public class DisplayName {
    @JsonProperty("DisplayName")
    private String displayName;
    @JsonProperty("UserID")
    private String userID;
    @JsonProperty("StdLog")
    private String stdLog;

    public DisplayName() {
    }

    @JsonCreator
    public DisplayName(@JsonProperty("DisplayName") String DisplayName, @JsonProperty("UserID") String UserID, @JsonProperty("StdLog") String StdLog) {
        this.displayName = DisplayName;
        this.userID = UserID;
        this.stdLog = StdLog;
    }

    public String getDisplayName() {
        return displayName;
    }

    @JsonProperty("DisplayName")
    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }

    public String getUserID() {
        return userID;
    }

    @JsonProperty("UserID")
    public void setUserID(String userID) {
        this.userID = userID;
    }

    public String getStdLog() {
        return stdLog;
    }

    @JsonProperty("StdLog")
    public void setStdLog(String stdLog) {
        this.stdLog = stdLog;
    }
}

... 删除了MOXy依赖项,并为JAXB添加了一个依赖项:

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.25.1</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.1</version>
    </dependency>

然而,现在我遇到了错误

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyReader not found for media type=application/json

而且我找到的解决方案都没有起到任何作用(例如,在Jersy客户端中找不到MessageBodyReader for media type=application/json、Glassfish:MessageBodyProviderNotFoundException)。

为什么?解决方案是什么?

共有1个答案

韦衡
2023-03-14

发布问题后不久,我在泽西岛用户指南中找到了解释和解决方案,其中写道:

为了使用Jackson作为JSON(JAXB/POJO)提供者,需要在可配置的(客户端/服务器)中注册JacksonFeature和ObjectMapper的ContextResolver(如果需要)。

由于MOXy是默认的媒体库,并自动注册到WebClient,除非注册了另一个媒体库,否则将使用它。因此,必须注册杰克逊媒体转换器...

Client client = ClientBuilder.newClient().register(JacksonFeature.class);

... 并添加相应的Maven依赖项:

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

我只是很惊讶教程和其他类似问题的答案都没有提到它。

 类似资料:
  • 我似乎无法正确注册Jackson ObjectMapper模块。 我使用的是 Guice Jersey Jackson (FasterXML) 堆栈。 我在这里讨论了如何基于各种问题定制ObjectMapper。特别是,我声明了一个ContextResolver,标记为@javax.ws.rs.ext.Provider和@javax.inject.Singleton。 我有一个GuiceServl

  • 我有一个网站,我只是想写一个脚本,发送字符串到一个文本输入在页面(唯一的一个)和点击提交。我构建了一个selenium系统,但被告知这是矫枉过正的,访问页面上的endpoint并以这种方式发送文本要“容易”得多。 线程“main”java.lang.IllegalStateException中出现异常:未找到InjectionManagerFactory。在org.glassfish.jersey

  • 我设计了一个多部分Jersey REST服务,如下所示,用于接收多部分请求(文件上传)并将文件保存在磁盘位置: 我的测试客户是: 但我无法得到回应。 当我使用HTML网页作为客户端通过调用REST服务上传文件时,它工作得很好,但从REST客户端它不工作。 客户有什么需要更改的吗?

  • 问题内容: 我在Spring启动项目中有一个与Jackson配置有关的问题 如Spring Boot博客中所述 我尝试自定义对象序列化。 在我的配置中添加新的配置bean之后 当我尝试输出类User的实例时,json结果不在CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES中 json输出是: 并不是 也许我需要在Jersey配置中注册一些东西才能激活我的自定义ob

  • 我想执行我们的服务器支持的 PATCH 请求,以便使用 Jersey 客户端进行测试。我的代码如下,有人可以让我知道下面的代码有什么问题吗? 这是完全的例外,

  • 当我的客户机应用程序尝试从我的安全RESTWeb服务请求资源时,我得到了粘贴在下面的错误。 我已经在这个主题上找到了这个答案,但是额外的代码似乎很极端。使用泽西岛客户端访问安全的宁静Web服务 有谁知道解决问题的更简单的方法吗? 我的项目:在服务器端,我正在使用jdbc realm的基本身份验证,这在浏览器中使用时工作正常。在客户端,我设置了用户名和密码,当我发送请求时发生错误。如果您需要代码片段