wake-up-neo.com

Jersey-Ausnahme: SEVERE: Ein Nachrichtentextleser für die Java-Klasse

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

32
VDev

Ich konnte das Problem durch Hinzufügen der Maven-Abhängigkeit für Jersey-Json beheben.

29
VDev

Damit es funktioniert, brauchen Sie nur zwei Dinge. Überprüfen Sie, ob Sie vermisst werden:

  1. Zunächst benötigen Sie @XmlRootElement annotation für Ihre Objektklasse/Entität.
  2. 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>
    
25
user2139024

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.

8
mooreds

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;
4
Jens Peters

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!!!
3
mkumar0304

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>
3
James.G

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.

2
Justas

Prüfen Sie einfach, ob Sie verschiedene Instanzen in Eclipse ausführen. Ich habe alle meine anderen Sitzungen beendet, Clean Build behebt das Problem

0
gibsosmart

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;
}
0
alex347

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 

0
Nick Liu