想象一下以下场景:
我使用以下参数向服务(使用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();
答案 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
方法来处理所有约定(也许您可能遇到有多个下划线的情况)。