Play会将请求中的参数分配给操作参数,例如:
public static void createArticle(String title, String content) {
}
但它不会修剪它们,所以我们通常在动作中使用这样的代码:
public static void createArticle(String title, String content) {
if(title!=null) title = title.trim();
if(content!=null) content = content.trim();
}
有没有办法让游戏自动修剪?
答案 0 :(得分:7)
使用自定义绑定器可以通过多种方式实现此目的。 一种做法是:
使用@As(binder=TrimmedString.class)
public class Application extends Controller {
public static class TrimmedString implements TypeBinder<String> {
@Override
public Object bind(String name, Annotation[] annotations, String value, Class actualClass, Type genericType) throws Exception {
if(value != null) {
value = value.trim();
}
return value;
}
}
public static void index(
@As(binder=TrimmedString.class) String s1,
@As(binder=TrimmedString.class) String s2,
@As(binder=TrimmedString.class) String s3) {
render(s1, s2, s3);
}
}
如果这对您来说过于冗长,只需使用@Global
绑定器来检查自定义@Trim
或@As('trimmed')
注释的字符串。 TypeBinder已经提供了所有注释,因此应该很容易实现。
所有这些都可以在custom binding下的文档中找到。
答案 1 :(得分:1)
一种简单的方法是使用对象映射代替单个String映射。
因此,您可以创建一个类调用Article,并创建一个修剪内容的setter。通常Play不需要你创建setter,它们是在幕后自动生成的,但如果你有特殊处理,你仍然可以使用它们。
public class Article {
public String title;
public String content;
public void setTitle(String title) {
this.title = title.trim();
}
public void setContent(String content) {
this.content = content.trim();
}
}
然后,您需要将文章传递给您的操作方法,而不是单个String元素,并且您的属性将作为对象映射过程的一部分进行修剪。
答案 2 :(得分:1)
您可以编写PlayPlugin并修剪请求的所有参数。
另一种可能性是使用Before-Interception。