2016-05-06 5 views
0

Ich möchte meiner Antwort einen neuen Header hinzufügen können. Ich erhalte die Fehlermeldung:Return-Liste als JSON mit Jersey/Spring Rest Server geben Fehler?

org.glassfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor aroundWriteTo SCHWEREN: MessageBodyWriter nicht für Medientyp gefunden = application/json, type = Klasse java.util.ArrayList, genericType = Klasse java.util.ArrayList.

Mein Code ist wie folgt:

@GET 
@Path("/persons") 
@Produces({ MediaType.APPLICATION_JSON }) 
public Response getPersons() 
{ 
    List<Person> persons = new ArrayList<Person>(); 
    persons.add(new Person(1, "John Smith")); 
    persons.add(new Person(2, "Jane Smith")); 

return Response.ok(persons).build(); 
} 

Als ich „List“ als Rückgabetyp verwenden und zurück „Personen“, gibt es eine erfolgreiche Rückkehr ist, aber wenn ich eine „Antwort“ Rückkehr erhalte ich die Error. Wie werde ich das los?

Antwort

1

Die Ausnahme besagt, dass Sie keinen Provider MessageBodyWriter haben. Grundsätzlich wegen MediaType.APPLICATION_JSON es bedeutet, dass Sie einige json framwork in Ihren Abhängigkeiten oder benutzerdefinierte Implementierung für @Provider Mehr Infos über Provider müssen 1.1 JAX-RS (nicht finden kann, JSR 339-Spezifikation online, kann pdf herunterladen von here 2.0 JAX-RS)

Wahrscheinlich wird dieses Problem lösen es für Sie:

für gradle

compile 'org.glassfish.jersey.media:jersey-media-json-jackson:2.22.2' 

für Maven

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

Wählen Sie die entsprechende Version für Ihr Setup von hier http://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson

Btw: SO LINK, SO LINK, SO LINK, SO LINK


Update nach @peeskillet Kommentar.

Guter Punkt mit, dass es bereits einige json assosiated Anbieter, aber es kann keine Antwort mit der Liste aus irgendeinem Grund zuordnen. Ich kann nicht viel darüber sagen, weil wir Ihre Einrichtung sehen müssen (Pom oder Gradle Build-Datei) oder Sie könnten versuchen, etwas wie https://stackoverflow.com/a/6081716/1032167 oder dieses https://stackoverflow.com/a/35039968/1032167 zu verwenden, um es zu lösen.


So verwenden (Option 1) Jackson oder verwenden (Option 2)

GenericEntity<List<Person>> entity = new GenericEntity<List<Person>>(persons) {}; 
Response.ok(entity).build(); 
+0

Dies sollte funktionieren, aber Ihre Argumentation ist falsch. Siehe die letzte Aussage des OP in der Frage. Dann werfen Sie einen Blick auf [diesen Beitrag] (http://stackoverflow.com/q/35039294/2587435). Scheint das OP hat bereits einen Provider, aber ist wahrscheinlich nicht mit Jackson, vielleicht MOXy. In diesem Fall würde das Hinzufügen von Jackson nicht funktionieren, sie müssten trotzdem MOXy entfernen. –

+0

@peeskillet Sie sind absolut richtig. Aus irgendeinem seltsamen Grund habe ich die letzte Zeile in OP-Post übersprungen. Btw schöne Erklärung in Link zur Verfügung gestellt – varren

0

Register Jackson-Funktion in Ihre Jersey Config. Dies fügt automatisch Jackson eingehende und ausgehende Kartenfunktionen zu Jersey hinzu.

public class JerseyConfig extends ResourceConfig { 
    public JerseyConfig() { 
     ... 
     register(JacksonFeature.class); 
     ... 
    } 

Weitere Informationen finden Sie unter https://jersey.java.net/documentation/latest/media.html#json.jackson.