2016-05-30 6 views
0

私はGET POSTメソッドとDELETEメソッドを持つ単純なRESTクライアントを持っています。Java Rest @GETは動作しますが、@ DELETEと@POSTパスはヒットしません。

奇妙なことに、GETメソッドだけが動作し、POSTもDELETEもヒットしないし、応答も「404 Not Found」です。

は、ここに私のRESTサービスとクライアントです:

インタフェース:

public interface MyInterface { 
    @GET 
    @Path("/content") 
    @Produces(MediaType.APPLICATION_JSON) 
    Response getAirports(); 

    @DELETE 
    @Path("/content/{id}") 
    @Produces(MediaType.APPLICATION_JSON) 
    Response deleteAirport(@PathParam("id") String id); 
} 

実装:

@Path("/source") 
public class SourceService extends AbstractService implements MyInterface { 

@Override 
    public Response getContent() { 
     DBCollection collection = getDBCollection("content"); 

     DBCursor cursor = collection.find(); 
     String serialize = JSON.serialize(cursor); 

     return Response.status(Response.Status.OK).entity(serialize).build(); 
    } 

    @Override 
    public Response deleteContent(@PathParam("id") Integer id) { 
     DBCollection collection = getDBCollection("content"); 

     BasicDBObject query = new BasicDBObject(); 
     query.append("id", id); 

     collection.remove(query); 

     return Response.status(Response.Status.OK).build(); 
    } 
} 

クライアント:

// This is working 
public void getContent() { 
     WebTarget path = collect.path("/content"); 
     Response response = path.request().get(); 
     LOGGER.info("collect.ping: " + response.readEntity(String.class) + "\n"); 
    } 

// This is not working 
public void deleteContent(Integer id) { 
     WebTarget path = collect.path("/content/"+id); 
     Response response = path.request(MediaType.APPLICATION_JSON).delete(); 
     System.out.println("object deleted:"+response); 
    } 

私はジャージを要求して試してみましたまたはapa cheクライアントは、しかし、それらのすべては404を返して、今私は絶望的です。

私に指示を与えることを望みます。

+0

問題を少し軽減してみてください。実装がただちにOK応答を返すようにする。 – Chill

+0

@ChillちょうどPathParamを削除しようとするとヒットし、OKを返します。どのようにそのことについて?私は間違った方法でパスパラメータを送信していますか? – neocorp

+0

"airport"などの文字列に変更しようとしています。また、次のようにクライアントにパラメータを渡しています。 public void deleteAirport(String iata){ "iata"あなたのクライアントコードで... –

答えて

2

これはInheritance with JAX-RSの重複の可能性があります。サブクラス内のすべての注釈を複製しようとしましたか?それとも、実装クラスで@PathParamを使用しないでください。

+0

woow!私はこれで一日中私の髪を引っ張ってきました。あなたはそれを保存しました...ありがとう、本当にありがとう! – neocorp

+0

あなたは大歓迎です! –

0

実際にクライアントをデバッグでき、実際にクライアントコードを「ステップスルー」できる場合は、

サーバコード内にブレークポイントを配置しても、実際にはブレークポイントは決してありません。次に、問題はWebサービスを公開する方法と、それをどのように消費しようとしているかにあります。

サーバーが期待するパラメーターの種類と、クライアントから渡す種類を変更してください。

サーバーとクライアントをより単純な型、つまり整数に変更でき、クライアントとサーバーの両方でブレークポイントを実際に取得できる場合は、問題がユーザーの型にあることがわかります。

私はあなたが何を言っているのか理解できますか?あなたは本当にあなたのパラメータを単純化し、そして/またはパラメータなしでそれを試してみる必要があります。

もっと簡単な作業ができたら、それを他のものに拡張することができます。

だけでは、このようクライアントにパラメータを渡している、また、そのような「空港」と...それを文字列に変更してみてください:

  public void deleteAirport(String iata) { 

しかし、あなたはあなたの中に「IATA」を使用していませんクライアントコード...

+0

ちょうど試して、それはPathParamなしで動作しますが、PathParamとして何かを追加すると、再び動作しません...何ができますか? そのメソッドは、パラメータを使用して、幸運なしで試しただけのクライアントテストメソッドです... – neocorp

+0

ブレークポイントを設定することはできますか?サーバーまたはクライアントで?または両方? –

+0

はい私はそれらのブレークポイントを打つことができますが、パラメータはありません。 – neocorp

関連する問題