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 对象只包含空值:

adr = {
    t: null,
    u: null
}

相反,如果我使用此代码读取数据,它可以正常工作:

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

我做错了什么?是 Play 框架的错误吗?

谢谢。

4

2 回答 2

4

对我来说,问题似乎在于 Eclipse 干扰了代码生成,并且通常会弄乱生成的字节码。

在 Eclipse 中关闭“自动构建”解决了这个问题。

此链接有帮助:https ://groups.google.com/forum/?fromgroups#!topic/play-framework/JYlkz_Nh31g

于 2012-06-03T13:59:01.700 回答
1

这个问题很老了,但我会描述我们的问题,以防万一有人遇到同样的情况。

简短的回答

尝试添加 setter 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)后,它可以工作。

更新:

我们发现表单绑定依赖于spring 框架版本。我们使用的是4.0.3-RELEASE,然后我们更新到4.0.5-RELEASE,这就是 Play 表单开始失败的时候。

于 2020-02-17T16:28:06.237 回答