2

ソケット通信から同じPOSTデータを受信する必要があります。

これは、POSTを送信して応答を受信するコードであり、正しく機能しているようです。

String data = "t=" + URLEncoder.encode("Title", "UTF-8") +
    "&u=" + URLEncoder.encode("http://www.myurl.com", "UTF-8");

URL url = new URL("http://localhost:9000/adserver");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();

BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String output = "Data received\r\n", line;
while ((line = rd.readLine()) != null) {
    output += line;
}
wr.close();
rd.close();

return ok(output);

これは、POSTを受け取るコードです。

Form<AdRequest> form = form(AdRequest.class).bindFromRequest();

if(form.hasErrors()) {
    return badRequest("error");
} else {
    AdRequest adr = form.get();
    return ok(adr.t + " - " + adr.u);
}

AdRequestモデルは次のように定義されます。

public class AdRequest {
    public String t;
    public String u;
}

フォームオブジェクトはデバッグでデータを確認できるためデータを受け取りますが、get()メソッドによって返されるadrオブジェクトにはnull値のみが含まれています。

adr = {
    t: null,
    u: null
}

代わりに、このコードを使用してデータを読み取ると、正しく機能します。

Map<String, String[]> asFormUrlEncoded = request().body().asFormUrlEncoded();
return ok(asFormUrlEncoded.get("t")[0] + " - " + asFormUrlEncoded.get("u")[0]);

私が間違っているのは何ですか?Play Frameworkのバグですか?

ありがとう。

4

2 に答える 2

4

私にとっての問題は、Eclipseがコード生成を妨害し、一般的に生成されたバイトコードを台無しにしていたことだったようです。

Eclipseで「自動ビルド」をオフにすると、問題が修正されました。

このリンクは役に立ちました:https ://groups.google.com/forum/?fromgroups#!topic / play-framework / JYlkz_Nh31g

于 2012-06-03T13:59:01.700 に答える
1

この質問は非常に古いものですが、誰かが同じ状況にある場合に備えて、私たちの問題について説明します。

短い答え

セッターを追加してみてくださいAdRequest

長い答え

フォームモデルクラスにセッターが必要であるか、Playがそれらを埋めないことがわかりました。どうしてか分かりません。一部の大学では、コードは以前と同じように機能します。私にとって、Playはセッターを求めています。わからない。

デバッグForm.bindFromRequestすると、最終的に次の行に到達します。

package org.springframework.beans;

class BeanWrapperImpl {
    ...
    private void setPropertyValue(BeanWrapperImpl.PropertyTokenHolder tokens, PropertyValue pv) throws BeansException {
        ...
        throw new NotWritablePropertyException(this.getRootClass(), this.nestedPath + propertyName, matches.buildErrorMessage(), matches.getPossibleMatches());

そしてmatches.buildErrorMessage()、次のようなメッセージを作成します。

Bean property email is not writable or has an invalid setter method

セッターを追加した後(例setEmail)、動作します。

アップデート:

フォームバインディングはSpringFrameworkのバージョンに依存することがわかりました。4.0.3-RELEASEを使用していた後、 4.0.5-RELEASEに更新しました。そのとき、Playフォームが失敗し始めました。

于 2020-02-17T16:28:06.237 に答える