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

前端 未结 4 1128
无人及你
无人及你 2020-12-17 15:57

I am using Jersey 2.8 Client to post data to RESTful endpoint. The code looks like

    final Client client = ClientBuilder.newClient();
    fina         


        
相关标签:
4条回答
  • 2020-12-17 16:27

    If you ok using Jackson 1.x, then you need to the following 3 things.

    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);
    
    0 讨论(0)
  • 2020-12-17 16:28

    I had the same issue when trying to get the response from an Apache server running PHP. My response was good from the server, but Spring was complaining with the MessageBodyWriter not found for type application/json. I added the Genson dependency to my pom.xml and it fixed it!

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

    Documentation can be found at: https://code.google.com/p/genson/

    0 讨论(0)
  • 2020-12-17 16:36

    try to write the ObjectNode as a 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));
    
    0 讨论(0)
  • 2020-12-17 16:46

    I added a comment above stating that the addition of X had worked.

    However, adding the following maven dependency to the pom.xml works as well, and seems like a more standard fix.

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

    Note: The org.glassfish.jersey.archetypes/jersey-quickstart-grizzly maven archetype adds the dependency above by default, but commented out with the comment "uncomment this to get JSON support".

    0 讨论(0)
提交回复
热议问题