2017-12-03 8 views
1

TomcatサーバーでJerseyで残りのAPIを作成しようとしています。私のアプリケーションは他のサービス(データベースなし)から入力を収集します。 私は、次のPOJOを作成しました:tomcatでjerseyを使用して@POSTを使用したマップが必要です

//this a pojo for parameters the application takes in the @POST request, a location lat/long 

@XmlRootElement 
public class DestLatLong { 
    private String lat; 
    private String lng; 

    public DestLatLong(){} 

    public String getLat() { 
     return lat; 
    } 

    public void setLat(String lat) { 
     this.lat = lat; 
    } 

    public String getLng() { 
     return lng; 
    } 

    public void setLng(String lng) { 
     this.lng = lng; 
    } 

} 

は、これらは、所定の場所に到達する応答に含まれる値は、チケットの価格です:

public class DestPriceResponse { 

    public DestPriceResponse() { 
    } 
    public String airport; 
    public String currency; 
    public String price; 
    public String getAirport() { 
     return airport; 
    } 
    public void setAirport(String airport) { 
     this.airport = airport; 
    } 
    public String getCurrency() { 
     return currency; 
    } 
    public void setCurrency(String currency) { 
     this.currency = currency; 
    } 
    public String getPrice() { 
     return price; 
    } 
    public void setPrice(String price) { 
     this.price = price; 
    } 
} 

私はマップを使用する必要がありますかここでpojoがJSONに正しくマップされていますか?またはこのオブジェクトは十分ですか?以下は

要求を処理しなければならないクラスであり、応答を返す:

public class DestinationResource { 


// Will map the resource to the URL todos 
@Path("/api") 
public class TodosResource { 

    // Allows to insert contextual objects into the class, 
    // e.g. ServletContext, Request, Response, UriInfo 
    @Context 
    UriInfo uriInfo; 
    @Context 
    Request request; 


    @POST 
    @Produces(MediaType.APPLICATION_JSON) 
    @Consumes(MediaType.APPLICATION_JSON) 
    public DestPriceResponse getDestPrice(String lat, String lng) { 
     DestPriceResponse priceResponse = new DestPriceResponse(); 

     NearestAirports nearest = new NearestAirports(); 
     nearest.parseNearestAirports(lat, lng); 
     return priceResponse; 
    } 

私が使用しているPOSTリクエストがある:

http://localhost:8080/webapi/rest/api?lat=60&lng=0

とヘッダがあります。

Content-Type = application/json

私は入れません:

HTTPステータス404 - 見つかりませんでした

タイプステータスレポート

メッセージオリジンサーバがターゲットの現在の表現 を見つけられませんでした

説明が見つかりませんまたはそれが存在することを開示するつもりはない。

のApache Tomcat/8.5.23

私の設定が含まれます:

rootProject.name = 'webapi'

とwebxml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
id="WebApp_ID" version="3.0"> 
    <display-name>webapi</display-name> 
<servlet> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> 
    <!-- Register resources and providers under com.vogella.jersey.first package. --> 
    <init-param> 
     <param-name>jersey.config.server.provider.packages</param-name> 
     <param-value>webapi</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Jersey REST Service</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
    </servlet-mapping> 
</web-app> 

どのように私は最高これをデバッグすることができ、何が間違っているのですか?

答えて

2

この呼び出しhttp://localhost:8080/webapi/rest/api?lat=60&lng=0あなたは以下のようgetDestPrice()メソッドの引数(緯度とLNG)に@QueryParam()注釈を使用してHTTP GET方法さらしている前提としています、あなたはデータオブジェクトを受け入れPOST方法を使用する場合は

@GET 
@Produces(MediaType.APPLICATION_JSON) 
public DestPriceResponse getDestPrice(@QueryParam("lat") String lat, @QueryParam("lng") String lng) { 

を次に、あなたのメソッドのシグネチャを変更する必要があります。

@POST 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_JSON) 
public DestPriceResponse getDestPrice(DestLatLong longLat) { 
  • はあなたのHTTP CALを変更しますLは任意のHttpClient(例えばAdvanced Rest Clientクロム拡張)Content-Type: application/json
  • 追加ヘッダを使用して、APIを呼び出すときに、ランタイムにあなたのためにこのオブジェクトを作成するDestLatLongオブジェクト
  • Jerseyを記述するJSON を渡します。あなたは/にHTTP GETエンドポイントを持っていないため、

あなたがエラー404を取得している答えを@Gal

+0

感謝を(あなたの代わりにPOSTを定義しました)。私はGETがより簡単なアプローチであることを発見したので、私は上記の例に従った。しかし、私がhttpClientでエンドポイントにGET要求を出すと、まだ見つからない。それはルーティングの問題、それをデバッグする簡単な方法であり、根本的な原因になる可能性がありますか? – Tlink

関連する問題