Jersey-Client-message-body-reader für Java-Typ nicht gefunden
Ich bin mit Jersey-1.1 (alt, ich weiß - da bin ich stecken mit Java 1.5). Ich mache eine einfache BEKOMMEN, wo ein Java-Objekt zurückgegeben wird, als die Einheit. Das Java-Objekt wird korrekt gemarshallt (Java, XML), weil ich kann die GET-Anfrage über das Internet und es funktioniert Super. Ich versuche, die Jersey-client, um die GET-Anforderung, und unmarshall es zurück auf das Java-Objekt, und dies ist, wo es fehlschlägt. Sollte nicht Jersey wissen, wie unmarshall die XML-erhält er von der GET-Anforderung zurück in die POJO, da es annotiert werden, richtig? Es funktioniert auf der server-Seite. Hier ist die exception die ich bekomme:
ClientHandlerException: A message body reader for Java type, class my.class.SearchResult, and MIME media type, application/xml was not found.
Hier ist der client-code:
private SearchResult search() {
WebResource wr = new Client().resource( "http://localhost:8080/MyProject/search" );
return wr.get( SearchResult.class );
}
Hier ist die JAXB annotierte POJO-ich bin mit auf dem client und server:
@XmlRootElement(name = "searchResults")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "searchResults", propOrder = {
"results"
})
public class SearchResult {
@XmlElement(name = "result")
private List<Result> results = new ArrayList<Result>();
public List<Result> getResults() {
return results;
}
...
}
Hier ist das innere Ergebnis POJO als gut:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "resultType", propOrder = {
"name",
"version",
"type"
})
public class Result {
private String name;
private String version;
private String type;
...
}
Hier ist der service selbst:
@Path("/search")
public class SearchRest {
@GET
@Produces(MediaType.APPLICATION_XML)
public SearchResult search() {
SearchResult result = new SearchResult();
....
return result;
}
}
Danke!
- könnten Sie Ihre
Result
Klasse? - Ich bearbeitet die post, mit dem Ergebnis, Klasse
- Vielleicht haben die Lösung gefunden auf meinem eigenen. Ich denke, putting jaxb-Gläser in meinem classpath gelöst. Ich war nicht immer alle Fehler zu zeigen, Sie waren nicht dort, aber meine Vermutung ist, dass die @XmlRootElement-annotation wurde ignoriert, zur Laufzeit, weil ich hatte keine jaxb-Gläser in meinem classpath. Gedanken dazu auf?
Du musst angemeldet sein, um einen Kommentar abzugeben.
fügen Sie die
@XmlRootElement
Anmerkung zu IhremResult
Klasse.Ich das Problem durch hinzufügen der JAXB Gläser zu meinem classpath der client-Seite. Ich weiß nicht, warum dadurch das problem gelöst ist, aber ich würde vermuten, es ist, weil die @XmlRootElement und weitere JAXB-Annotationen in meine POJOs wurden einfach ignoriert zur Laufzeit, da die Gläser nicht vorhanden waren. Dies führte in Jersey nicht zu erkennen, die Anmerkungen und daher denken, es gab keine Möglichkeit der übersetzung zwischen xml und POJO auf der client-Seite. Ich entdeckte die Lösung, wenn ich habe versucht, die alternative Weise, die vermeidet die Notwendigkeit für Anmerkungen, wo du wickeln Sie die Wurzel POJO in ein JAXBElement. Ich aktualisierte die web-service-Klasse zu produzieren, ein JAXBElement und aktualisiert den client zu erwarten, dass die gleichen. Dann bekam ich einen NoClassDefFoundError das war bezeichnend für das fehlende Gläser, da wurde ich Referenzierung JAXBElement direkt. Ich denke, ich hatte Glück.