it-swarm.com.de

Jersey: MessageBodyWriter für Medientyp = Anwendung/Json nicht gefunden, Typ = Klasse org.codehaus.jackson.node.ObjectNode?

Ich verwende Jersey 2.8 Client, um Daten an den RESTful-Endpunkt zu senden. Der Code sieht so aus

    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 () sieht aus wie

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);
    }

Wenn ich versuche, den Test auszuführen, sehe ich einen Fehler als 

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

Was fehlt mir hier?

Vielen Dank

15
daydreamer

Wenn Sie mit Jackson 1.x in Ordnung sind, müssen Sie die folgenden 3 Dinge beachten.

1. Jersey Jackson zu deiner pom.xml hinzufügen:

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

2. Erstellen Sie eine 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. Anbieter bei ClientBuilder registrieren:

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);
9
Alden

Ich habe oben einen Kommentar hinzugefügt, der besagt, dass die Zugabe von X funktioniert hat.

Das Hinzufügen der folgenden Maven-Abhängigkeit zu pom.xml funktioniert jedoch ebenfalls und scheint eher ein Standard-Fix zu sein.

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

Hinweis: Der Archetyp org.glassfish.jersey.archetypes/jersey-quickstart-grizzly maven fügt die obige Abhängigkeit standardmäßig hinzu, wird jedoch mit dem Kommentar "auskommentiert, um JSON-Unterstützung zu erhalten".

7
Farskeptic

Ich hatte das gleiche Problem, als ich versuchte, die Antwort von einem Apache-Server mit PHP zu erhalten. Meine Antwort war vom Server gut, aber Spring beschwerte sich, dass der MessageBodyWriter für den Typ application/json nicht gefunden wurde. Ich habe die Genson-Abhängigkeit zu meiner pom.xml hinzugefügt und es wurde behoben!

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

Die Dokumentation finden Sie unter: https://code.google.com/p/genson/

5
wingman88

versuchen Sie, den ObjectNode als String zu schreiben:

// 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));
1
herau