Play Framework - 如何将Web数据映射到对象数据

时间:2015-11-28 15:26:51

标签: java data-binding playframework

想象一下以下场景:

我使用以下参数向服务(使用Play框架)发送请求(参数' s名称应按约定强调):

first_name=James&second_name=Parker

此外,我的代码库中有一个模型类,看起来像这样。

public class User {
    @Constraints.Required
    private String firstName;

    @Constraints.Required
    private String secondName;

    public String getFirstName() {
        return firstName;
    }

    public String getSecondName() {
        return secondName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

}

我想要做的就是用相应的参数映射参数的名称 字段名称。使用Play Framework的以下语句失败,因为 无法使用给定的请求参数初始化用户对象。

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

2 个答案:

答案 0 :(得分:0)

首先阅读:https://www.playframework.com/documentation/2.1.1/JavaRouting

然后:

GET    /myMethod/:firstName/:seccondName    controllers.MyController.myMethod(firstName: String, seccondName: String)

和简单的方法:

public myMethod(String firstName, String lastName) {
    User u = new User();
    u.setFirstName(firstName);
    u.setSeccondName(seccondName);
}

显然,如果你使用play framework 2。

答案 1 :(得分:0)

您在请求参数名称中有下划线,但您的类在camelCase中有成员(例如first_name vs fistName [此处缺少r])。

其次,似乎这些类成员被声明为私有,并且您没有setter方法只有getter(即setFirstName)。

为了进行绑定,您的类被实例化并且值已设置且无法执行此操作将失败。

修复上述内容后,您应该能够绑定,然后调用form.hasErrors()来检查验证是否失败。

希望有所帮助。

<强>更新

要处理请求参数名称和类成员名称之间的不匹配,您可能需要手动设置。

在你的控制器方法中,你会做这样的事情:

Map<String, String[]> reqBody = request().body().asFormUrlEncoded()
Map<String, String[]> newReqBody = new HashMap<>();

for(Map.Entry<String, String[]> entry: body.entrySet()) {
    newBody.put(underscoreToCamelCase(entry.key()), entry.value());
}

Form<User> form = Form.form(User.class).bindFromRequest(newReqBody);

请注意,我正在使用bindFromRequest的重载版本here

然后,您应该以通用的方式实现underscoreToCamelCase方法来处理所有约定(也许您可能遇到有多个下划线的情况)。