ServiceFramework icon indicating copy to clipboard operation
ServiceFramework copied to clipboard

serviceframework中filter怎么用 我看到FilterHelper 但没地方引用过

Open zhouzhenhao opened this issue 12 years ago • 8 comments

serviceframework中filter怎么用 我看到FilterHelper 但没地方引用过

zhouzhenhao avatar Oct 26 '12 01:10 zhouzhenhao

Filter 是个很棒的东西。在ServiceFramework中,filter就是Controller 一个简单private方法。然后你告诉它要拦截那些方法。然后一切就搞定啦。

分两步:

step 1:

在你的controller中写一个private方法。

    private String[] tags;

    private void check_params() {
        tags = param("tags", " ").split(",");
        if (tags.length == 0) {
            render(HTTP_400, fail("必须传递标签"));
        }
    }

注意到我们定义这个方法的同时也定义了一个实例变量。这个实例变量是可以被你拦截的 action方法直接访问的。

step2:

接着在controller声明哪些方法需要被check_params方法拦截。

 @BeforeFilter
  private final static Map $check_params = map(only, list("save", "search"));

这里是说,controller中的save 和 search 方法会被check_params 作为前置过滤器拦截掉。

你自己要做的就这么多。

完整的范例你可以参看下:

com.example.controller.tag.TagController

这个时候你可能会有一个疑问,如果我想 'check_params' 在其他的controller中也用到怎么办? 恩 把他放到父类,然后你的controller继承这个父类,这样所有的controller就能使用这个方法啦。

举个例子,我想统计所有的action执行的时间,下面写的是一个其他Controller的父类,记住,父类需要继承自 'net.csdn.modules.http.ApplicationController';

public abstract class ApplicationController extends net.csdn.modules.http.ApplicationController {



    @AroundFilter
    private final static Map $print_action_execute_time = map();

    private void print_action_execute_time(RestController.WowAroundFilter wowAroundFilter) {
        long time1 = System.currentTimeMillis();
        wowAroundFilter.invoke();
        logger.info("execute time:[" + (System.currentTimeMillis() - time1) + "]");
    }

}

上面基本涵盖了你的需求了。不需要配置文件,不需要写类。发现那些action可以共用一个filter,直接写个方法在当前类申明一下就行。

allwefantasy avatar Oct 26 '12 03:10 allwefantasy

@allwefantasy 今天换了台电脑 下的最新包 通过curl访问curl -XPOST http://127.0.0.1:9400/tag_group -d "name=asdadadasd" 报[net.csdn.validate.ValidateResult@fc2a1a] 控制台报 Hibernate: select taggroup0_.id as id4_, taggroup0_.name as name4_ from tag_group taggroup0_ where taggroup0_.name=? [2012-10-30 12:32:18,593][INFO ][com.example.controller.admin.TagAdminController] execute time:[0] 调试 TagGroup tagGroup = TagGroup.create(params()); if (!tagGroup.save()) { render(HTTP_400, tagGroup.validateResults); } params()有参数 save()presence验证不通过 不知道是不是create的问题

zhouzhenhao avatar Oct 30 '12 04:10 zhouzhenhao

可能是你TagGroup已经有name字段为"asdadadasd "的值了。再或者你可以tagGroup.save(false)来跳过验证。建议清空下数据库表里面的内容即可。

allwefantasy avatar Oct 30 '12 05:10 allwefantasy

@allwefantasy 数据库中没有重复的值 为此新建了一个User model(继承Model 里面没有任何注解) 对应数据库建了user表 id name id为int自动增长 curl -XPOST http://127.0.0.1:9400/user -d "name=asdadadasd" 数据库只插入id没有插入name值 应该是User user = User.create(params())时候没有把参数值赋给user

zhouzhenhao avatar Oct 30 '12 06:10 zhouzhenhao

那就奇怪啦..... 我刚才自己试了下 没有问题的。 要不你看看 src/META-INF/persistence.xml 这个文件的内容正常不?通常是模型类和库名。

allwefantasy avatar Oct 30 '12 07:10 allwefantasy

@allwefantasy 应该在create()方法那个地方 save()方法我看过代码应该是没有问题的 在create的时候没有把值赋给实体类的field create()方法没法看

zhouzhenhao avatar Oct 30 '12 08:10 zhouzhenhao

@allwefantasy JDK换成1.6就没问题了 大哥框架好像对JDK1.7支持有问题啊

zhouzhenhao avatar Oct 30 '12 09:10 zhouzhenhao

我是在1.7下开发的 哈哈

allwefantasy avatar Oct 30 '12 09:10 allwefantasy