文档章节

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

奋斗到天明
 奋斗到天明
发布于 2015/08/27 16:22
字数 938
阅读 172
收藏 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
12.7K
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
43
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
2.3K
0
【PLAY FrameWork】PLAY框架快速入门

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

磊神Ray
2012/02/28
0
0
Play 1.x框架学习之五:错误信息显示 (error message display In play framework)

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

奋斗到天明
2015/08/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

maven坐标和依赖

一、maven坐标详解 <groupId>com.fgt.club</groupId><artifactId>club-common-service-facade</artifactId><version>3.0.0</version><packaging>jar</packaging> maven的坐标元素说......

老韭菜
今天
1
0
springmvc-servlet.xml配置表功能解释

问:<?xml version="1.0" encoding="UTF-8" ?> 答: xml version="1.0"表示是此xml文件的版本是1.0 encoding="UTF-8"表示此文件的编码方式是UTF-8 问:<!DOCTYPE beans PUBLIC "-//SPRING//......

隐士族隐逸
今天
1
0
基于TP5的微信的公众号获取登录用户信息

之前讲过微信的公众号自动登录的菜单配置,这次记录一下在TP5项目中获取自动登录的用户信息并存到数据库的操作 基本的流程为:微信设置自动登录的菜单—>访问的URL指定的函数里获取用户信息—...

月夜中徘徊
今天
0
0
youTrack

package jetbrains.teamsys.license.runtime; 计算lis package jetbrains.ring.license.reader; 验证lis 安装后先不要生成lis,要把相关文件进行替换 ring-license-checker-1.0.41.jar char......

max佩恩
今天
1
0
12.17 Nginx负载均衡

Nginx负载均衡 下面的dig看到可以返回2个IP,就是解析出来的IP,这样我们可以做负载均衡。 dig www.qq.com 1.vim /usr/local/nginx/conf/vhost/fuzai.conf 2.添加如下配置 upstream qq //定义...

芬野de博客
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部