首页 文章

Jersey:找不到媒体类型= application / json的MessageBodyWriter,类型= class org.codehaus.jackson.node.ObjectNode?

提问于
浏览
15

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

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

我在这里错过了什么?

谢谢

4 回答

  • 9

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

    1. Add Jersey Jackson to your pom.xml:

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

    2. Create a 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. Register providers with 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);
    
  • 7

    我在上面添加了一条评论,说明X的添加有效 .

    但是,将以下maven依赖项添加到pom.xml也可以,并且看起来像是一个更标准的修复 .

    <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
        </dependency>
    

    注意:默认情况下, org.glassfish.jersey.archetypes/jersey-quickstart-grizzly maven原型添加了上述依赖项,但注释了注释"uncomment this to get JSON support" .

  • 1

    尝试从运行PHP的Apache服务器获取响应时,我遇到了同样的问题 . 我对服务器的反应很好,但Spring抱怨找不到类型为application / json的MessageBodyWriter . 我将Genson依赖项添加到我的pom.xml中并修复了它!

    <dependency>
            <groupId>com.owlike</groupId>
            <artifactId>genson</artifactId>
            <version>0.99</version>
        </dependency>
    

    文档可在以下位置找到:https://code.google.com/p/genson/

  • 5

    尝试将ObjectNode编写为String:

    // your code
    final ObjectNode payload = getObjectMapper().createObjectNode();
    payload.put("startDate", DateTime.now().toString());
    payload.put("endDate", DateTime.now().plusDays(30).toString());
    payload.put("networkId", 0);
    
    // the solution
    String entity = getObjectMapper().writeValueAsString(payload);
    
    final Response response = builder.accept(MediaType.APPLICATION_JSON).post(Entity.entity(entity, MediaType.APPLICATION_JSON));
    

相关问题