2011-02-07 5 views
0

J'utilise Jersey/Java pour développer mes services REST. Je dois retourner une représentation XML pour mon CarStore:Http 204 erreur dans le service Web REST (Jersey)

@XmlRootElement 
public class CarStore { 
private List<Car> cars; 

public List<Car> getCars() { 
    return cars; 
} 
public void setCars(List<Car> cars) { 
    this.cars = cars; 
} 

Voici mon objet Car:

@XmlRootElement 
> public class Car { 
private String carName; 
private Specs carSpecs; 
private Category carCategory; 
public String getCarName() { 
    return carName; 
} 
public void setCarName(String carName) { 
    this.carName = carName; 
} 
public Specs getCarSpecs() { 
    return carSpecs; 
} 
public void setCarSpecs(Specs carSpecs) { 
    this.carSpecs = carSpecs; 
} 
public Category getCarCategory() { 
    return carCategory; 
} 
public void setCarCategory(Category carCategory) { 
    this.carCategory = carCategory; 
} 

} 

Spécifications et catégorie sont énumérations comme ceci:

@XmlRootElement 
> public enum Category { 

SEDANS, COMPACTS, WAGONS, HATCH_HYBRIDS, SUVS, CONVERTIBLES, COMPARABLE; 
} 

Ma classe de ressource est :

@GET 
@Produces({MediaType.APPLICATION_XML}) 
public CarStore getCars() 
{ 
    return CarStoreModel.instance.getAllCars(); 
} 

Mon client jersey est:

WebResource service = client.resource(getBaseURI()); 
System.out.println(service.path("rest").path("cars").accept(
MediaType.APPLICATION_XML).get(String.class)); 

Je reçois Http 204 erreur sur l'accès alongwith exception client:

com.sun.jersey.api.client.UniformInterfaceException

Toutes les idées ? Merci !

EDIT: Je n'ai pas encore développé la classe de modèle ... J'ai juste initialisé quelques objets de voiture comme données factices et les ai mises dans la carstore. Montrer tous les cours ici serait très maladroit. BTW, désolé d'avoir écrit 204 Erreur .. c'est juste que je reçois une exception qui m'a amené à le penser.

+5

Mais HTTP 204 n'indique pas une erreur. – Arvin

Répondre

0

Je crois que vous obtenez un UniformInterfaceException parce que votre fonction getCars() ne retourne pas un corps de réponse HTTP. Le problème principal est que votre liste de voitures n'est pas convertie en XML par JAXB car il manque l'annotation @XmlElement.

Votre fonction getCars() doit être:

@GET 
@Produces(MediaType.APPLICATION_XML) 
public CarStore getCars() { 
    // myCarStore is an instance of CarStore   
    return myCarStore.getCars(); 
} 

et votre liste de voiture CarStore doit être défini:

@XmlElement(name="car") 
private List<Car> cars; 
3

Je suppose que l'exception n'est pas liée au code de réponse (204), car 204 est une condition de réussite qui indique "Aucun contenu".

+0

L'exception UniformInterfaceException est levée ["lorsque le code d'état de la réponse HTTP indique une réponse inattendue"] (http://jersey.java.net/nonav/apidocs/1.1.1-ea/jersey/com/sun /jersey/api/client/UniformInterfaceException.html), donc, fondamentalement, toute réponse à l'exception de 200 entraînerait la levée de l'exception. – tronman

+3

Un 204 provoquera une exception client si le contenu est attendu. Dans le cas de la méthode HTTP GET, Jersey considère 204 une erreur car un contenu de réponse non vide est attendu: http://jersey.java.net/nonav/apidocs/1.16/jersey/com/sun/jersey/api/client /WebResource.html#get(java.lang.Class) Mais pour POST, il est possible de ne spécifier aucun contenu attendu: http://jersey.java.net/nonav/apidocs/1.16/jersey/com/sun/jersey/ api/client/WebResource.html # post (java.lang.Class) Mes propres tests confirment ces instructions. – Will

0

Est-ce que vous retournez au format xml? Je ne suis pas sûr de ce que fait getAllCars mais vous pouvez utiliser quelque chose comme Fiddler pour vous aider à voir le trafic et voir ce qui est retourné au client et si c'est dans le bon format etc

0

Dans votre code client, est le chemin de la ressource correct? Assurez-vous que getBaseURI renvoie une valeur.

Peut-être essayer:

Client client = new Client(); 
WebResource resource = client.resource(getBaseURI()); 
CarStore carStore = resource.path("/rest/cars").accept(MediaType.APPLICATION_XML).get(CarStore.class); 
0

N'êtes-vous pas manque une annotation @Path sur votre classe de ressources?

@GET 
@Path("cars") 
@Produces({ MediaType.APPLICATION_XML }) 
public CarStore getCars() { 
    return CarStoreModel.instance.getAllCars(); 
} 

Vérifiez si l'URL à laquelle votre REST WS est monté celui que vous attendez en mettant un point d'arrêt dans votre méthode getCars() (ou mettre un System.out.println) pour vous assurer qu'il se fait appeler.

0

Il semble qu'il y ait une vérification codée en dur dans Jersey pour lancer une exception UniformInterfaceException lorsqu'un HTTP 204 est renvoyé.

La meilleure solution sera de 'réparer' le serveur de repos afin qu'il ne renvoie jamais de null. par exemple. renvoie une liste vide ou une classe avec des valeurs non définies.

Sinon, vous devrez attraper UniformInterfaceException qui est vraiment laid

if (getStatus() == 204) { 
     throw new UniformInterfaceException(this); 
    } 

Plus d'infos ici: http://grepcode.com/file/repo1.maven.org/maven2/com.sun.jersey/jersey-client/1.17.1/com/sun/jersey/api/client/ClientResponse.java#ClientResponse.getEntity%28java.lang.Class%2Cjava.lang.reflect.Type%29

Questions connexes