文档章节

Play 1.x框架学习之二:统一校验机制 (common way to validate in play framework)

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:22
字数 938
阅读 169
收藏 0
点赞 0
评论 0

Play框架提供十分便捷的校验注解机制,结合@before拦截器标签可以实现便利的拦截机制,不需要逐个类去编写校验代码了,这里结合上一章的功能测试实现一个增加的校验。 首先要用到两个models类 App/models/Heart.java:

package models;

import java.util.Date;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.codehaus.jackson.map.annotate.JsonFilter;

import play.data.validation.Email;
import play.data.validation.Match;
import play.data.validation.MaxSize;
import play.data.validation.Required;
import play.data.validation.Valid;

@Entity
@Table(name = "heart")public class Heart extends BaseModel {
	@Id
	public Long id;

	@Required
	@MaxSize(value = 12)
	public String code;

	public String nick;

	@MaxSize(value = 12)
	public String passwd;

	@Email
	public String qqmail;

	@Match(value = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}")
	public String ip;

	@Valid
	@Transient
	public List box;
	public Long intime;
	public Long ontime;
}App/models/Guess.java:package models;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import play.data.validation.MaxSize;
import play.data.validation.Range;
import play.db.jpa.GenericModel;

@Entity
@Table(name = "guess")
public class Guess extends BaseModel {
	@Id
	public Long id;

	@Range(max = 5, min = 1)
	public Integer type;

	@MaxSize(value = 256)
	public String idea;
}然后是controller层面,需要实现一个基类,抽象出一些共用的方法:
App/controllers/Application.java:package controllers;

import play.*;
import play.mvc.*;
import util.JsonUtil;

import java.util.*;
public class Application extends Controller {
    @Before
    public static void validateInterceptor(){
		if(validation.hasErrors()){
			response.status = 550;
			renderText(JsonUtil.object2JsonString(validation.errors()));
		}	
    }
}具体的controller类:
App/controllers/Hearts.java:package controllers;

import javax.persistence.Query;

import play.data.validation.Min;
import play.data.validation.Valid;
import play.db.jpa.JPA;
import play.db.jpa.JPABase;
import util.JsonUtil;
import models.Heart;

public class Hearts extends Application{
	public static void add(@Valid Heart heart){
		boolean result = heart.create();
		renderText(JsonUtil.object2JsonString(result));
	}

	public static void load(@Min(value = 1)Long id) {
		Heart heart = Heart.findById(id);
		renderText(JsonUtil.object2JsonString(heart));
	}
}需要映射的url:
Conf/routes:POST        /heart                 Hearts.add测试需要用到的两个yaml文件:
Test/yml/db/heart.yml:Heart(h1):
  id: 1001
  code: pony
  nick: 小马哥
  passwd: pony123
  qqmail: 10001@qq.com
  ip: 192.168.0.123
  box[0].id: 1
  box[0].type: 1
  box[0].idea: 马哥有点肥  
  box[1].id: 2
  box[1].type: 2
  box[1].idea: 有钱人  
  box[2].id: 3
  box[2].type: 3
  box[2].idea: 汝甚吊  

Heart(h2):
  id: 1002
  code: robin
  nick: 小李子
  passwd: robin100
  qqmail: 100@qq.com
  ip: 192.168.0.122
  box[0].id: 1
  box[0].type: 1
  box[0].idea: 小李子不厚道  
  box[1].id: 2
  box[1].type: 4
  box[1].idea: 大气桶  
  box[2].id: 3
  box[2].type: 3
  box[2].idea: 汝甚吊  

Heart(h2):
  id: 1002
  code: robin
  nick: 小李子
  passwd: robin100
  qqmail: 100@qq.com
  ip: 192.168.0.122
  box[0].id: 4
  box[0].type: 1
  box[0].idea: 小李子不厚道  
  box[1].id: 5
  box[1].type: 4
  box[1].idea: 大气桶  
  box[2].id: 6
  box[2].type: 3
  box[2].idea: 汝甚吊Test/yml/request/heart.yml:add_normal:
  heart.id: '1003'
  heart.code: jack
  heart.nick: 老马
  heart.passwd: jack2
  heart.qqmail: 200@qq.com
  heart.ip: 192.168.1.122
  heart.box[0].id: '7'
  heart.box[0].type: '1'
  heart.box[0].idea: 老马太瘦了  
  heart.box[1].id: '8'
  heart.box[1].type: '5'
  heart.box[1].idea: 矮矬富  
  heart.box[2].type: '3'
  heart.box[2].idea: 汝甚吊 

add_errors:
  heart.id: '1003'
  heart.code: jack12345678900
  heart.nick: 老马
  heart.passwd: jack2
  heart.qqmail: 200qq.com
  heart.ip: 192.168.1.122
  heart.box[0].id: '7'
  heart.box[0].type: '21'
  heart.box[0].idea: 老马太瘦了  
  heart.box[1].id: '8'
  heart.box[1].type: '5'
  heart.box[1].idea: 矮矬富  
  heart.box[2].type: '3'
  heart.box[2].idea: 汝甚吊测试类:
Test/function/HeartsTest.java:package function;

import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;

import models.Heart;
import play.db.jpa.JPA;
import play.db.jpa.JPABase;
import play.mvc.Http.Response;
import play.test.Fixtures;
import play.test.FunctionalTest;

public class HeartsTest extends BasisTest{
	Map rootmap =null;

	@Before
	public void init(){
		rootmap=(Map)Fixtures.loadYamlAsMap("yml/request/hearts.yml");
    	if(!JPA.em().getTransaction().isActive()){
    		JPA.em().getTransaction().begin();
    	}

    	Fixtures.delete(Heart.class);
    	Fixtures.loadModels("yml/db/heart.yml");
    	JPA.em().getTransaction().commit();
	}

	@Test
	public void testAddNormal(){
		int beforeRequestSize = Heart.findAll().size();
		Map map = rootmap.get("add_normal");
		Response response = POST("/heart", map);
		assertIsOk(response);

		int afterRequestSize = Heart.findAll().size();
		assertEquals(beforeRequestSize, afterRequestSize - 1);

		Heart heart = Heart.findById(Long.parseLong(map.get("heart.id")));
		assertNotNull(heart);

		String result = response.out.toString();
		assertEquals("true", result);
	} 

	@Test
	public void testAddParamErrors(){
		int beforeRequestSize = Heart.findAll().size();
		Map map = rootmap.get("add_errors");
		Response response = POST("/heart", map);
		assertStatus(550, response);;

		int afterRequestSize = Heart.findAll().size();
		assertEquals(beforeRequestSize, afterRequestSize);

		Heart heart = Heart.findById(Long.parseLong(map.get("heart.id")));
		assertNull(heart);

		String result = response.out.toString();
		assertFalse("".equals(result));
		assertFalse("null".equals(result));

		JSONArray parseArray = JSON.parseArray(result);
		assertEquals(6, parseArray.size());
	}
}错误时返回的信息:[{"key":"heart.box[0].type","message":"validation.range","variables":["1.0","5.0"]},{"key":"heart.box[0]","message":"validation.object","variables":[]},{"key":"heart.code","message":"validation.maxSize","variables":["12"]},{"key":"heart.qqmail","message":"validation.email","variables":[]},{"key":"heart.box","message":"validation.object","variables":[]},{"key":"heart","message":"validation.object","variables":[]}]当然play给出的错误信息都是英语的,如果想要在前台展现正文,可以借助play国际化的机制,这个在下一篇中会提到。

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
Play Framework 2.0 介绍

Play Framework 刚刚发布了 2.0 正式版,来看看 Play Framework 2.0 的新特性介绍吧。 原生支持 Java 和 Scala Play Framework 1.x 完全是采用 Java 编写的,可通过插件来支持 Scala,而 2....

红薯 ⋅ 2012/03/14 ⋅ 20

Play 1.x 学习资料汇总

1.Play!Framework学习笔记:初识Play(http://blog.csdn.net/w302974215/article/details/46926007) 2.Play Framework入门引导(http://somefuture.iteye.com/blog/1985667) 3.Play框架1.2.7版......

IT追寻者 ⋅ 2016/07/22 ⋅ 0

Play!框架文档翻译:验证码(Captcha)

Because anyone can post a comment to our blog engine, we should protect it a little to avoid automated spam. A simple way to protect a form from this is to add a captcha image. ......

红薯 ⋅ 2010/07/13 ⋅ 0

【PLAY FrameWork】PLAY框架快速入门

前言 目前,Ruby on Rails及Grails等动态脚本语言正发展得如火如荼,而在以Java为首的开源最大阵营中,也出现了各种框架。其中最著名的就是Play框架(http://download.playframework.org)。 ...

磊神Ray ⋅ 2012/02/28 ⋅ 0

关于Play(Play 2.0 介绍)

Play 2.0 介绍 2007开始,我们一直致力于让Java开发web应用更容易。Play始于一个内部项目Zenexity,它深刻影响了我们开发web项目的方式:关注开发者生产力,遵循web架构的特点,并打破常规,...

大东哥 ⋅ 2012/03/19 ⋅ 0

Play 1.x框架学习之五:错误信息显示 (error message display In play framework)

错误信息包括两种,一种是异常信息的显示,一种是后台验证信息显示。而且显示又分直接页面跳转的提交,和通过Ajax的提交。 先看,异常信息与直接页面跳转的例子。在例子中,运用play框架的c...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

Intellij Idea 配置 Play 1.x Framework 开发环境 (configuration Play 1 x Framework development environmen...

虽然在公司使用的是Eclipse,但是我还是很中意俊俏的Intellij Idea(当然还有风骚的Sublime Text),Play 是一个类ROR的框架(Play 1.x 是比较正统的Java框架,Play 2.x混入Scala血统,个人不...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

Play 1.x框架学习之七:多数据库切换与源码修改 ( Databases Switch And Modify Source Code)

在单数据源(单个ip)下的多库,可以使用use xxdb 命令进行切换,但是如果多个数据源的情况下,use命令就不行了。在play框架中,提供了多数据源多库的切换。本文不提供完全的例子,只提供部分...

刀狂剑痴 ⋅ 2015/08/27 ⋅ 0

分享一个用Scala Play + Slick 开始写的一个学习的开源web app

好, 最近在學Play,用Play在這些天寫了一個初始的app,用的是Play! framework 2.x + Play slick 1.x,前端用的是,原始的bootstrap。已经开源,https://github.com/hellomaya/scala-connec...

自由之信 ⋅ 2016/01/24 ⋅ 2

【转】play总结性介绍

颠覆臃肿的JavaEE开发框架(bloated Enterprise Java stacks)的Play框架1.0发布,它在很多方面有其革命性的独创,也有助于我们了解现在JavaEE框架的不足。 Play框架吸收PHP RUBY动态语言的特...

mj4738 ⋅ 2011/12/04 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java序列化和反序列化

1、什么是序列化和反序列化 序列化:把对象转换为字节序列的过程。 反序列化:把字节序列恢复成对象的过程。 2、被序列化的类需要实现serializable接口,只是为了标注该对象是可以被序列化的...

IT-Mamba ⋅ 4分钟前 ⋅ 0

流式构建原理

流式构建需要达到分钟级的数据更新频率,Kylin采用类似于Spark Streaming的做法,每隔数分钟进行一次微构建。这边的构建需要考虑到一个延迟因素,分布式网络存在延迟等因素,该时间段的数据有...

无精疯 ⋅ 5分钟前 ⋅ 0

在maven项目工程编写solr代码,需要的依赖

solrJ <dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>6.6.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents<......

爱运动的小乌龟 ⋅ 12分钟前 ⋅ 0

Spring Cloud Config

Spring Cloud Config application.yml 和 bootstrap.yml 区别 加载顺序 bootstrap.yml 先加载 application.yml 后加载 bootstrap.yml 用于应用程序上下文的引导阶段。 bootstrap.yml 由父 Sp...

施长成 ⋅ 22分钟前 ⋅ 0

MapReduce V2——YARN调度

一、MapReduce的局限性 1、JobTracker的单点问题 2、TaskTracker的作业信息分配的过于简单,当有资源消耗较大的或者时间较长的Task分配在同一个节点上的时候,容易失败或者等待时间过长 3、作...

cjxcloud ⋅ 23分钟前 ⋅ 0

EOS踩坑--脆弱的数据库

安装EOS我就不在这赘述了,来唠唠EOS踩到的坑,跟着官方文档走,然后到了同步数据的时候,Ctrl+Z结束了之后,再次运行报错 root@ubuntu:~# nodeos -e -p eosio --plugin eosio::chain_api_pl...

开源首席鉴黄师 ⋅ 23分钟前 ⋅ 0

对于程序员的招聘问题,作为软件人的一些吐槽和建议

作为软件人,找工作有时候似乎挺苦逼的。 说真的,让我去掉前面这句中“似乎”二字吧。就是苦逼!很多人都曾抱怨处在招聘的一方很糟糕——我们没有任何可靠的方式来甄别会写代码并且写得好的...

老道士 ⋅ 39分钟前 ⋅ 0

Linux下MySQL表名不区分大小写的设置方法(抄袭别人的)

Linux下MySQL表名不区分大小写的设置方法 MySQL表名不区分大小写的设置方法 在用centox安装mysql后,把项目的数据库移植了过去,发现一些表的数据查不到,排查了一下问题,最后发现是表名的大...

随风而浮沉 ⋅ 48分钟前 ⋅ 0

ubuntu下安装宋体simsun

sudo cp simsun.ttc /usr/share/fonts cd /usr/share/fonts sudo chmod 644 simsun.ttc 更新字体缓存: 代码: sudo mkfontscale 代码: sudo mkfontdir 代码: sudo fc-cache -fsv 安装chrome扩......

wangxuwei ⋅ 49分钟前 ⋅ 0

利用 ssh 传输文件

Linux 下一般可以用 scp 命令通过 ssh 传送文件: #把服务器上的 /home/user/a.txt 发送到本机的 /var/www/local_dir 目录下scp username@servername:/home/user/a.txt /var/www/local_dir...

大灰狼时间 ⋅ 59分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部