ServiceFramework
ServiceFramework copied to clipboard
serviceframework中filter怎么用 我看到FilterHelper 但没地方引用过
serviceframework中filter怎么用 我看到FilterHelper 但没地方引用过
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 今天换了台电脑 下的最新包 通过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的问题
可能是你TagGroup已经有name字段为"asdadadasd "的值了。再或者你可以tagGroup.save(false)来跳过验证。建议清空下数据库表里面的内容即可。
@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
那就奇怪啦..... 我刚才自己试了下 没有问题的。 要不你看看 src/META-INF/persistence.xml 这个文件的内容正常不?通常是模型类和库名。
@allwefantasy 应该在create()方法那个地方 save()方法我看过代码应该是没有问题的 在create的时候没有把值赋给实体类的field create()方法没法看
@allwefantasy JDK换成1.6就没问题了 大哥框架好像对JDK1.7支持有问题啊
我是在1.7下开发的 哈哈