亲爱的Playframework用户。
我已经切换到播放框架2.2,我对验证有疑问。我希望有人能指出我正确的方向。
我有一个控制器来获取一个集合。
GET /country controllers.api.CountryController.list(fetchInactive: Int ?= 0, sortBy: String ?= "name", sortDir: String ?= "asc" ) public static Result list( int fetchInactive, String sortBy, String sortDir)
它工作得很好,虽然我想限制可以作为sortBy字段指令发送的可能值。
E.g。元素列表。比如'name','id'等。 在游戏1中,验证控制器参数非常容易。见Play Framework: automatic validation of controller methods applied?
我知道如何将JSR-303与模型一起使用,虽然这是一个API,我想验证各个参数。
有人可以给我一个提示或示例我是如何实现这一目标的吗?
我想使用注释来定义我自己的验证器来验证sortBy只接受某些字符串值。
提前致谢,
答案 0 :(得分:0)
实际上在这种情况下,如果用户提供超出允许范围的内容,您应该使用sortBy
和sortDir
的默认值,您可以在操作中轻松完成(不需要使用)验证器)
public static Result list(Integer fetchInactive, String sortBy, String sortDir) {
Integer resolvedFetchInactive
= (fetchInactive != null && Arrays.asList(0, 1, 2).contains(fetchInactive)) ? fetchInactive : 0;
String resolvedSortBy
= (sortBy != null && Arrays.asList("name", "id").contains(sortBy)) ? sortBy : "name";
String resolvedSortDir
= (sortDir != null && Arrays.asList("asc", "desc").contains(sortDir)) ? sortDir : "asc";
if (!resolvedSortBy.equals(sortBy) || !resolvedSortDir.equals(sortDir) || !resolvedFetchInactive.equals(fetchInactive)) {
//redirect to the same list with allowed values
return redirect(routes.Application.list(resolvedFetchInactive, resolvedSortBy, resolvedSortDir));
}
return ok("You're going to display list sorted by: " + resolvedSortBy + " " + resolvedSortDir + ", fetchInactive is: " + resolvedFetchInactive);
}