如何在playframework中自动修剪请求参数

时间:2011-06-30 09:38:50

标签: playframework trim

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();
}

有没有办法让游戏自动修剪?

3 个答案:

答案 0 :(得分:7)

使用自定义绑定器可以通过多种方式实现此目的。 一种做法是:

  • 在修剪字符串的某处定义acustom binder
  • 使用@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