文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:22
字数 938
阅读 469
收藏 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国际化的机制,这个在下一篇中会提到。
奋斗到天明
粉丝 19
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
访问安全控制解决方案

本文是《轻量级 Java Web 框架架构设计》的系列博文。 今天想和大家简单的分享一下,在 Smart 中是如何做到访问安全控制的。也就是说,当没有登录或 Session 过期时所做的操作,会自动退回到...

黄勇
2013/11/03
3.4K
6
我的架构演化笔记 功能1: 基本的用户注册

“咚咚”,一阵急促的敲门声, 我从睡梦中惊醒,我靠,这才几点,谁这么早, 开门一看,原来我的小表弟放暑假了,来南京玩,顺便说跟我后面学习一个网站是怎么做出来的。 于是有了下面的一段...

强子哥哥
2014/05/31
976
3
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
Nutch学习笔记4-Nutch 1.7 的 索引篇 ElasticSearch

上一篇讲解了爬取和分析的流程,很重要的收获就是: 解析过程中,会根据页面的ContentType获得一系列的注册解析器, 依次调用每个解析器,当其中一个解析成功后就返回,否则继续执行下一个解...

强子哥哥
2014/06/26
712
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库高频面试点,事务/乐观锁/悲观锁/CAS/MySQL存储引擎

事务的ACID特性是什么? 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读...

osc_45536bvu
58分钟前
16
0
大数据BI软件助力企业数字化转型

当下,「新基建」势头正盛,随着“新基建”成为热议话题,数字化也随之成为企业面临的新机遇和新挑战。新基建的核心就是数据,数据是数字经济和企业数字化转型的生产要素和发展动力。 再看看...

osc_0boqdoe2
今天
7
0
凯旋创投来志刚:基因治疗新时代,大戏刚刚开始

  2017 年,全球第一个基因治疗方法 CAR-T 细胞药物 Kymriah 获得 FDA 上市批准,从此掀起了基因治疗的热潮。随着相关技术和政策的不断成熟,基因治疗市场也随之扩大。根据德勤发布的《引领...

osc_k3vwonkw
今天
10
0
LightningChart.NET使用两个BarSeries创建简单的2D图表

本教程介绍了如何使用两个BarSeries创建简单的2D图表。 BarSeries将数据值表示为矩形条,并且可以用于以非常清晰的方式可视化数据之间的差异和方差。 在本教程中,BarSeries用于表示两年期间...

roffey
今天
0
0
Mybatis trim 标签的 2 个妙用!

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼...

osc_x03qsedc
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部