2012-04-19 5 views
0

Jersey RESTを使用して構築されたWebサービスにJSONをポストする際に問題があります。データは決してサーバーに到着しないようです。サーバーへのJSON POSTが到着しない

タスク全体の流れは次のように多少です:

JavascriptのPOST JSON - > Webサーバ - > WebサーバJSONをPOSTすることになっているのJavascriptれるJSONを取得し、ここで

を印刷パス/posttestとサーバへのデータ、:

<script type="text/javascript"> 
$(function() { 
    var name = "Tony"; 
    $.post(
      '/posttest', 

      function (data) { 
       alert("sune " + data.name); 
      }); 
}) 
</script> 

私はすべてのこれらのクラスを実行しているWebサーバ(グリズリー)を持っている:

このクラスは、JSONデータを消費POSTリクエストを処理するために、JAX-RSのAPIを使用しています。

@XmlRootElement 
public class StatusBean { 
    private String name; 

    public StatusBean() { 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name= name; 
    } 
} 

:ここ

@Path("/posttest") 
public class PostTest { 
@POST 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public Response doPost(StatusBean b) { 
    System.out.println("---> " + b.getName()); 
    StatusBean statusBean = new StatusBean(); 
    return Response.status(Response.Status.ACCEPTED).entity(statusBean).build(); 
} 

は、データをにしてから、シリアル化されることをBeanの定義でありますここにコンソールのデータを出力するテストクライアントクラスがあります。

ClientConfig cc = new DefaultClientConfig(); 
Client c = Client.create(cc); 
WebResource r = c.resource("http://localhost:9998/posttest"); 
StatusBean post = r.type(MediaType.APPLICATION_JSON_TYPE).post(StatusBean.class, new StatusBean()); 
System.out.println("--> " + post.getName()); 
+0

これは、コンパイルコードではありません。手作業で質問にすべて貼り付けたのですか?特に、Webサービス実装クラスでは、メソッドを誤って呼び出して、存在しないフィールドを参照しています。正しいコードを投稿してください。 – Perception

+0

編集済み!まだ不明な点があれば教えてください。私は自分のプロジェクトからコードの必要な部分を貼り付けました。 – nihulus

答えて

0

StatusBeanはという名前のフィールドではなく、{"name":"Tony"}と一致する必要があります。

BTW。 RESTEasyサーブレット用のRESTリソースマッピングは何ですか?上記の設定では、/*にする必要があります。

+0

私はJavaScriptを更新しました。ちょうどStringを送信しましたが、奇妙なエラーメッセージが出ました:ALLVARLIG:JavaクラスStatusBeanとJavaタイプクラスStatusBeanとMIMEメディアタイプapplication/octet-streamのメッセージ本文リーダー見つかりません。 RESTEasy thoを使用していません。使用する必要がありますか? – nihulus

+0

あなたのAJAX呼び出しのコンテンツタイプをapplication/jsonに設定する - http://stackoverflow.com/questions/2845459/jquery-how-to-make-post-use-contenttype-application-json –

+0

@nihulus - Javaクライアントでテスト、 'MediaTypeを使用します。'MediaType.APPLICATION_JSON_TYPE'の代わりに' APPLICATION_JSON'を使用します。私はあなたのWebサービスコードを少し編集しました。なぜなら、まだそのメソッド参照エラーがあったからです。 – Perception

0

私はジャージーではなくレセプションでしか経験していませんが、私はJAX-RS標準に頼っています。

このようなエラーが発生した場合は、HTTP応答の詳細を常に調べる必要があります。ブラウザでネットワークモニタを開き、HTTPレスポンスコードを確認します。 JSONが送信したJavaオブジェクトとStatusBeanのJavaオブジェクトが不一致であるため、405を取得したと思います。あなたのJSONは '名前'プロパティを持っている間あなたはJavaのbeanは 'dat'プロパティを持っています。

また、javascriptと同様にJavaオブジェクトをシリアライズしていることを確認してください。これはjackson serializorを使用して実現できます。これを使用するには、単にあなたのクラスパスにそれを含めます。これは可能性がMavenのUsgin:

<dependency> 
    <groupId>com.sun.jersey</groupId> 
    <artifactId>jersey-server</artifactId> 
    <version>1.8</version> 
</dependency> 

このリンクは役に立つかもしれません:http://www.mkyong.com/webservices/jax-rs/json-example-with-jersey-jackson/

+0

返信Ty!私はコードを編集して、ただ文字列をポストするだけです。 – nihulus

+0

最終的には、その時に一歩を取ろうとします。引き続き引数を削除して、実際に正しいJSONを返す/生成できることを確認してください。あなたのオブジェクトマッパー(シリアライザ)が正しく設定されていないようです。 – werk

+0

ええ、それは何を恐れているのですか、それを正しく設定する方法がわかりません。 – nihulus

関連する問題