惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园_首页
H
Help Net Security
N
Netflix TechBlog - Medium
Apple Machine Learning Research
Apple Machine Learning Research
P
Proofpoint News Feed
A
About on SuperTechFans
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
宝玉的分享
宝玉的分享
aimingoo的专栏
aimingoo的专栏
F
Fortinet All Blogs
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
Martin Fowler
Martin Fowler
I
InfoQ
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
B
Blog RSS Feed
U
Unit 42
The Cloudflare Blog
Y
Y Combinator Blog

博客园 - 一路前行

RestTemplate之GET和POST调用和异步回调 ConditionalOnProperty fastjson序列化乱序问题 IE中的console.log spring boot 中添加mongodb支持 javacript onclick事件中传递对象参数 Java Lambda 表达式 对 Map 对象排序 比较两个list对象是否相同 ubuntu redis 自启动配置文件(关机有密码) spring中订阅redis键值过期消息通知 网站架构之性能优化(转) Json转Java Bean java @ResponseBody返回值中去掉NULL字段 合并两个java bean对象非空属性(泛型) spring mvc 删除返回字符串中值为null的字段 ubuntu下postgreSQL安装配置 十大Intellij IDEA快捷键(转) C#封装好的Win32API IntelliJ Idea 常用快捷键列表
spring mvc 4 校验
一路前行 · 2016-07-25 · via 博客园 - 一路前行

一、controller中添加:

@Resource
GatewayValidator gatewayValidator;
@RequestMapping(value = "/gateway/signup", method = RequestMethod.POST)
public ApiResponse signup(@Valid Gateway gateway, BindingResult result) {
    ApiResponse rspResult = new ApiResponse();
    gatewayValidator.validate(gateway, result);
    if(result.hasErrors()){
        rspResult.setCode(ApiCode.PARMAS_ERROR);
        rspResult.setMessage(BaseUtils.GetValidErrorMessage(result));
    }
    else {
        //do something
    }
    return rspResult;
}

二、model中添加(简单的校验可以直接卸载model类中):

package smarthome.api.models;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.time.DateUtils;
import org.hibernate.validator.constraints.NotEmpty;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Gateway extends BaseClass implements Serializable {
    
    /**
     * None
     */
    protected String vendorCode;
    /**
     * None
     */
    protected String productCode;
    /**
     * None
     */
    @NotEmpty(message = "序列号不能为空")
    protected String serialNumber;

    public Gateway() {
    }
    
    public String getVendorCode() {
        return vendorCode;
    }
    public void setVendorCode(String vendorCode) {
        this.vendorCode = vendorCode == null ? null : vendorCode.trim();
    }

    public String getProductCode() {
        return productCode;
    }
    public void setProductCode(String productCode) {
        this.productCode = productCode == null ? null : productCode.trim();
    }

    public String getSerialNumber() {
        return serialNumber;
    }
    public void setSerialNumber(String serialNumber) {
        this.serialNumber = serialNumber == null ? null : serialNumber.trim();
    }
}

三、简单的校验

package smarthome.api.validators;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import javax.annotation.Resource;
import java.util.List;

@Component
public class GatewayValidator implements Validator {
    public boolean supports(Class clazz) {
        return Gateway.class.equals(clazz);
    }
    public void validate(Object target, Errors errors) {
        Gateway gateway = (Gateway) target;
        if(gateway.getGatewayId() == null && StringUtils.isEmpty(gateway.getSerialNumber())){
            errors.rejectValue("gatewayId", null, "网关编号和序列号不能同时为空");
            errors.rejectValue("serialNumber", null, "网关编号和序列号不能同时为空");
        }
    }
}

四、嵌套的校验

1、父类(gateway)中添加校验

package smarthome.api.validators;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import javax.annotation.Resource;
import java.util.List;


@Component
public class GatewayValidator implements Validator {
    @Resource
    private ModuleValidator moduleValidator;
    public boolean supports(Class clazz) {
        return Gateway.class.equals(clazz);
    }
    public void validate(Object target, Errors errors) {
        Gateway gateway = (Gateway) target;
        if(gateway.getGatewayId() == null && StringUtils.isEmpty(gateway.getSerialNumber())){
            errors.rejectValue("gatewayId", null, "网关编号和序列号不能同时为空");
            errors.rejectValue("serialNumber", null, "网关编号和序列号不能同时为空");
        }
        for(Module module : (List<Module>)gateway.getModuleList()){
            ValidationUtils.invokeValidator(moduleValidator, module, errors);
        }
    }
}

2、子类(module)中的校验

package smarthome.api.validators;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import javax.annotation.Resource;

@Component
public class ModuleValidator implements Validator {
    @Resource
    private IModuleService moduleService;
    public boolean supports(Class clazz) {
        return Module.class.equals(clazz);
    }
    public void validate(Object target, Errors errors) {
        Module module = (Module) target;
        if (StringUtils.isEmpty(module.getSerialNumber())) {
            errors.rejectValue("serialNumber", null, "模块序号不能为空");
        }
        else {
            if(moduleService.getFirst(module.getSerialNumber()) != null){
                errors.rejectValue("serialNumber", null, "模块序列号已经存在");
            }
        }
    }
}