Ich habe einen auf Jersey basierenden Rest WS, der JSON ausgibt. Ich implementiere einen Jersey-Client, um das WS aufzurufen und die JSON-Antwort zu verwenden. Der Clientcode, den ich habe, ist unten
WebResource r = restClient.resource (UriBuilder.fromUri ("http: // localhost /") .port (8080) .build ()); String resp. R.path ("/ user"). accept (MediaType.APPLICATION_JSON) .get (String.class); Benutzer [] Benutzer = r.Pfad ("/ user"). accept (MediaType.APPLICATION_JSON) .get (Benutzer []. Klasse);
Die zweite Zeile gibt die Antwort des JSON-Strings korrekt aus. Die dritte Zeile zum Marshalling von JSON zum POJO findet jedoch nicht statt und ich erhalte die folgende Ausnahme stacktrace
SEVERE: Ein Nachrichtentextleser für die Java-Klasse [Lorg.shoppingsite.model.entity.jpa.User;] und die Java-Typenklasse [Lorg.shoppingsite.model.entity.jpa.User; und die MIME-Medientypanwendung /. json wurde nicht gefunden 21. Dezember 2011 11:32:01 Uhr com.Sun.jersey.api.client.ClientResponse getEntity SEVERE: Die registrierten Nachrichtentextleser, die mit dem MIME-Medientyp kompatibel sind, lauten: */* -> com.Sun.jersey.core.impl.provider.entity.FormProvider com.Sun.jersey.core.impl.provider.entity.StringProvider com.Sun.jersey.core.impl.provider.entity.ByteArrayProvider com.Sun.jersey.core.impl.provider.entity.FileProvider com.Sun.jersey.core.impl.provider.entity.InputStreamProvider com.Sun.jersey.core.impl.provider.entity.DataSourceProvider com.Sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider $ General com.Sun.jersey.core.impl.provider.entity.ReaderProvider com.Sun.jersey.core.impl.provider.entity.DocumentProvider com.Sun.jersey.core.impl.provider.entity.SourceProvider $ StreamSourceReader com.Sun.jersey.core.impl.provider.entity.SourceProvider $ SAXSourceReader com.Sun.jersey.core.impl.provider.entity.SourceProvider $ DOMSourceReader com.Sun.jersey.core.impl.provider.entity.XMLRootElementProvider $ General com.Sun.jersey.core.impl.provider.entity.XMLListElementProvider $ General com.Sun.jersey.core.impl.provider.entity.XMLRootObjectProvider $ General com.Sun.jersey.core.impl.provider.entity.EntityHolderReader
Ich habe die richtigen MIME-TYPEN in meiner Anfrage. Mein POJO wurde mit XMLRootElement kommentiert. Was vermisse ich.
Vielen Dank
Ich konnte das Problem durch Hinzufügen der Maven-Abhängigkeit für Jersey-Json beheben.
Damit es funktioniert, brauchen Sie nur zwei Dinge. Überprüfen Sie, ob Sie vermisst werden:
Sie müssen die Abhängigkeit für jersey-json hinzufügen, wenn Sie fehlen. Für Ihre Referenz habe ich diese Abhängigkeit in meine pom.xml eingefügt.
<dependency>
<groupId>com.Sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.17.1</version>
</dependency>
Ich weiß, dass dieser Beitrag alt ist, und Sie haben das schon vor langer Zeit herausgefunden, aber nur, um die Leute zu retten, die dies irgendwann lesen werden.
Sie haben wahrscheinlich vergessen, der Entität, die Sie an den Endpunkt übergeben, eine Anmerkung hinzuzufügen, so dass Jersey nicht weiß, wie er den empfangenen POJO verarbeiten soll.
@XmlRootElement(name = "someName")
lege einfach das hier
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Wenn Sie ein Uberjar oder ein "schattiertes Glas" erstellen, stellen Sie sicher, dass Ihre Meta-Inf-Dienstdateien zusammengeführt werden. (Dies hat mich bei einem Dropwizard-Projekt mehrmals gebissen.)
Wenn Sie das gradle shadowJar-Plugin verwenden, möchten Sie mergeServiceFiles()
in Ihrem shadowJar
-Ziel aufrufen: https://github.com/johnrengelman/shadow#merging-service-files
Sie sind nicht sicher, was die analogen Befehle für Maven oder andere Build-Systeme sind.
Wir haben uns auch entschieden, Jersey als Lösung zu verwenden. Aber da wir org.JSON in den meisten Fällen verwenden, ist diese Abhängigkeit nicht notwendig und wir haben uns nicht gut gefühlt.
Daher haben wir die String-Darstellung verwendet, um ein org.JSON-Objekt anstelle von zu erhalten
JSONObject output = response.getEntity(JSONObject.class);
wir benutzen es jetzt so:
JSONObject output = new JSONObject(response.getEntity(String.class));
wo JSONObject von org.JSON stammt und die Importe geändert werden könnten von:
-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
Fügen Sie vor Beginn des Unterrichts in Ihrem POJO einfach folgende Zeilen hinzu, und Ihr Problem ist gelöst . @Produces ("application/json") @XmlRootElement Siehe Beispiel Import javax.ws.rs.Produces; import javax.xml.bind.annotation.XmlRootElement;
/**
* @author manoj.kumar
* @email [email protected]
*/
@Produces("application/json")
@XmlRootElement
public class User {
private String username;
private String password;
private String email;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
add below lines inside of your web.xml
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
Now recompile your webservice everything would work!!!
In meinem Fall verwende ich POJO. Und ich habe vergessen, POJOMappingFeature als true zu konfigurieren. Maycon hat dies in einer frühen Antwort darauf hingewiesen. Einige Leute könnten jedoch Probleme haben, sie korrekt in web.xml zu konfigurieren, hier ist mein Beispiel.
<servlet>
<servlet-name>Jersey Servlet</servlet-name>
<servlet-class>com.Sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
<init-param>
<param-name>com.Sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
Versuchen Sie Folgendes hinzuzufügen:
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>1.4</version>
</dependency>
Dieses Problem kann auch auftreten, wenn Sie HTTP GET
mit dem Nachrichtentext verwenden. In diesem Fall hilft das Hinzufügen von jersey-json lib, @XmlRootElement
oder das Ändern von web.xml nicht. Sie sollten die URL QueryParam
oder HTTP POST
verwenden.
Prüfen Sie einfach, ob Sie verschiedene Instanzen in Eclipse ausführen. Ich habe alle meine anderen Sitzungen beendet, Clean Build behebt das Problem
Sie müssen Ihre eigene MessageBodyReader
und MessageBodyWriter
für Ihre Klasse Lorg.shoppingsite.model.entity.jpa.User
implementieren.
package javax.ws.rs.ext;
import Java.io.IOException;
import Java.io.InputStream;
import Java.lang.annotation.Annotation;
import Java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
public interface MessageBodyReader<T extends Object> {
public boolean isReadable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public T readFrom(Class<T> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
InputStream entityStream) throws IOException, WebApplicationException;
}
package javax.ws.rs.ext;
import Java.io.IOException;
import Java.io.OutputStream;
import Java.lang.annotation.Annotation;
import Java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
public interface MessageBodyWriter<T extends Object> {
public boolean isWriteable(Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public long getSize(T t,
Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType);
public void writeTo(T t,
Class<?> type,
Type genericType,
Annotation[] annotations,
MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException, WebApplicationException;
}
Einige können verwirrt sein, warum das Hinzufügen von Jersey-Json-Glas dieses Problem nicht lösen kann. Ich habe herausgefunden, dass dieses Glas neuer als jersey-json-1.7.jar ist (1.7.0 funktioniert nicht, aber 1.7.1 funktioniert gut.). hoffe das kann helfen