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

如何在playframework中自动修剪请求参数,playframework,trim,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) cont

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

有没有办法让play自动修剪它们?

一个简单的方法是使用对象映射,而不是单个字符串映射

因此,您可以创建一个类调用文章,并创建一个裁剪内容的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();
    }
}

然后,您需要将文章传递到操作方法中,而不是单个字符串元素,并且在对象映射过程中,您的属性将被修剪。

有多种方法可以通过自定义绑定实现这一点。 一种方法是:

  • 定义用于修剪字符串的acustom活页夹
  • 将要修剪的每个参数注释为(binder=TrimmedString.class)

    公共类应用程序扩展控制器{
    公共静态类TrimmedString实现了TypeBinder{
    @凌驾
    公共对象绑定(字符串名称、注释[]注释、字符串值、类actualClass、类型genericType)引发异常{
    if(值!=null){
    value=value.trim();
    }
    返回值;
    }
    }
    公共静态空隙指数(
    @As(binder=TrimmedString.class)字符串s1,
    @As(binder=TrimmedString.class)字符串s2,
    @As(binder=TrimmedString.class)字符串s3){
    渲染(s1、s2、s3);
    }
    }
    
如果这对您来说太冗长,只需为字符串使用
@Global
活页夹,检查自定义
@Trim
@As('trimmed')
注释。TypeBinder已经有了所有可用的注释,所以这应该很容易实现

所有这些都可以在下的文档中找到。

您可以编写一个命令并修剪请求的所有参数


另一种可能是使用。

这是可行的,但不是我所期望的。我必须以这种方式向模型中添加许多方法。希望有更简单的方法。但是谢谢你,你唯一的选择就是创建你自己的活页夹。一个新的答案显示了如何做到这一点,或者看看
@Before
不能在这里使用,因为您无法在“Before”方法中获取其他操作的参数。@Freewind:应该可用。谢谢,在操作之前在全局范围内修剪所有参数是最简单的方法。这很有帮助,谢谢。但是我们需要为每个字段添加注释,这很不方便。如果您真的想修剪所有字符串,只需在TypeBinder上使用@Global并修剪所有字符串。我稍后会尝试,然后确定最佳答案:)TypeBinder正是为此目的而设计的,因此我更喜欢它而不是@Before解决方案。在@Before中正确地实现这一点对我来说似乎相当复杂。您不知道参数将在操作中使用的类型。某些类型可能依赖于前导/尾随空格。
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);
    }
}