2011-02-07 16 views
0

私はJersey/Javaを使用してRESTサービスを開発しています。私は私のCarStore用XML表現を返す必要があります。ここではREST Webサービス(Jersey)のHttp 204エラー

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

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

は私の車のオブジェクトです:

@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; 
} 

} 

仕様とカテゴリは、このような列挙型です:

@XmlRootElement 
> public enum Category { 

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

マイリソースクラスがあります:

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

私のジャージクライアントは、次のとおりです。

com.sun.jersey.api.client.UniformInterfaceException

任意のアイデア:

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

私は、クライアントの例外を伴って含むアクセスのHTTP 204エラーを取得しています?ありがとう!

EDIT:私はまだモデルクラスを開発していません...私はダミーデータとしていくつかの車オブジェクトを初期化し、それらをカーストアに入れました。すべてのクラスをここに表示するのは非常に面倒です。 ご参考までに、204エラーを書いて申し訳ありません。

+5

しかし、HTTP 204エラーを示すものではありません。 – Arvin

答えて

0

を私はあなたのgetCars()機能は、HTTPレスポンスボディを返すされていないので、あなたがUniformInterfaceExceptionを得ていると信じています。根本的な問題は、@XmlElementアノテーションがないために、あなたのカーリストがJAXBによってXMLに変換されていないことです。

あなたgetCars()関数は次のようになります。

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

し、あなたの車のリストを定義する必要があります。

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

204が "No Content"を示す成功条件であるため、例外が応答コード(204)に関連していないと推測しています。

+0

UniformInterfaceExceptionがスローされる["HTTP応答のステータスコードが期待されていない応答を示すとき"](http://jersey.java.net/nonav/apidocs/1.1.1-ea/jersey/com/sun /jersey/api/client/UniformInterfaceException.html)、基本的には200以外の応答であれば例外がスローされます。 – tronman

+3

内容が予期される場合、204はクライアント例外を引き起こします。 GET HTTPメソッドの場合、空ではない応答コンテンツが予想されるため、Jerseyは204エラーとみなします。http://jersey.java.net/nonav/apidocs/1.16/jersey/com/sun/jersey/api/client /WebResource.html#get(java.lang.Class)しかし、POSTでは、コンテンツを指定することはできません:http://jersey.java.net/nonav/apidocs/1.16/jersey/com/sun/jersey/ api/client/WebResource.html#post(java.lang.Class)私自身のテストでは、これらのステートメントを確認します。 – Will

0

xml形式で返品していますか?私はgetAllCarsが何をしているのか分かりませんが、あなたはトラフィックを見て、クライアントに返されているものとそれが正しいフォーマットのものかどうかを調べるためにFiddlerのようなものを使うことができます

0

クライアントコードでは、正しい? getBaseURIが値を返すことを確認してください。

おそらく試してみてください。

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

は、あなたのリソースクラスに@Pathアノテーションが不足していませんか?あなたのREST WSは、それが実際に呼び出されることを確認するために、あなたのgetCarsにブレークポイントを置くことで期待して1()メソッド(またはのSystem.out.printlnを置く)に搭載されている

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

チェックURL場合れます。

0

Jerseyには、HTTP 204が返されたときにUniformInterfaceExceptionをスローするようにハードコードされたチェックがあるようです。

残りのサーバーを「修正」して、nullを返さないようにすることをお勧めします。例えば値が設定されていない空リストまたはクラスを返します。エルス

あなたは

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

詳細情報ここでは本当に醜いですUniformInterfaceExceptionをキャッチする必要があります。 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

関連する問題