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

标签 java json spring rest jersey

我正在使用 Jersey 2.8 Client 将数据发布到 RESTful 端点。代码看起来像

    final Client client = ClientBuilder.newClient();
    final WebTarget target = client.target(url).path("inventorySummary");
    final Invocation.Builder builder = target.request().header("Content-Type", MediaType.APPLICATION_JSON);

    final ObjectNode payload = getObjectMapper().createObjectNode();
    payload.put("startDate", DateTime.now().toString());
    payload.put("endDate", DateTime.now().plusDays(30).toString());
    payload.put("networkId", 0);

    final Response response = builder.accept(MediaType.APPLICATION_JSON).post(Entity.entity(payload, MediaType.APPLICATION_JSON));
    assertStatus(Response.Status.OK.getStatusCode(), response);
    final JsonNode jsonReply = parseResponse(response);

getObjectMapper() 看起来像

public ObjectMapper getObjectMapper() {
        return new ObjectMapper()
                .configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false /* force ISO8601 */)
                .configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true)
                .configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING, true)
                .setSerializationInclusion(JsonSerialize.Inclusion.ALWAYS);
    }

当我尝试运行测试时,我看到错误为

MessageBodyWriter not found for media type=application/json, type=class org.codehaus.jackson.node.ObjectNode, genericType=class org.codehaus.jackson.node.ObjectNode

我在这里错过了什么?

谢谢

最佳答案

如果你可以使用 Jackson 1.x,那么你需要做以下 3 件事。

1.将 Jersey Jackson 添加到您的 pom.xml:

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

<强>2。创建一个ContextResolver:

@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    final ObjectMapper defaultObjectMapper;

    public ObjectMapperProvider() {
        defaultObjectMapper = getObjectMapper();
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return defaultObjectMapper;
    }

    public static ObjectMapper getObjectMapper() {
        return new ObjectMapper()
                .configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false /* force ISO8601 */)
                .configure(SerializationConfig.Feature.WRITE_ENUMS_USING_TO_STRING, true)
                .configure(DeserializationConfig.Feature.READ_ENUMS_USING_TO_STRING, true)
                .setSerializationInclusion(JsonSerialize.Inclusion.ALWAYS);
    }
}

3.向 ClientBuilder 注册提供程序:

final Client client = ClientBuilder.newBuilder()
        .register(ObjectMapperProvider.class)
        .register(JacksonFeature.class)
        .build();

final WebTarget target = client.target(url).path("inventorySummary");

final ObjectNode payload = ObjectMapperProvider.getObjectMapper().createObjectNode();
payload.put("startDate", DateTime.now().toString());
payload.put("endDate", DateTime.now().plusDays(30).toString());
payload.put("networkId", 0);

final Response response = target.request(MediaType.APPLICATION_JSON)
                                .post(Entity.json(payload));

assertStatus(Response.Status.OK.getStatusCode(), response);

关于java - Jersey :找不到媒体类型 = 应用程序/json、类型 = 类 org.codehaus.jackson.node.ObjectNode 的 MessageBodyWriter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23601842/

相关文章:

java - 如何在 json 文件中编辑和添加嵌套数据?

json - 使用 Apache Camel 将 REST 自定义转换为 SOAP 到 REST

php - 检查 PHP 中解码的 JSON 字符串数组中是否有数字

java - Spring Web MVC : Use same request mapping for request parameter and path variable

java - 防止碰撞时 TreeMap 合并

java - mapred.reduce.tasks 没有按预期工作

java - Java获取MapReduce的输入输出个数

java - 创建名称为 'tilesViewResolver' 的 bean 时出错

java - 使用 CrudRepository 只提取某些字段?

java - 如何获取鼠标输入但鼠标仍然影响桌面?