异常捕获类 package com.bdcourtyard.common.exception; import java.util.HashMap; import java.util.List; import java.util.Map; import com.bdcourtyard.common.utils.StringUtil; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.exc.InvalidFormatException; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; @ControllerAdvice public class GlobalExceptionHandler { /** * 全局异常捕捉处理 * * @param ex * @return */ @ResponseBody @ExceptionHandler(value = Exception.class) public MaperrorHandler(Exception ex) { Map map = new HashMap (); if(ex instanceof MethodArgumentNotValidException){ map.put("code", "400"); map.put("msg", ((MethodArgumentNotValidException) ex).getBindingResult().getFieldError().getDefaultMessage()); }else if (ex instanceof HttpMessageNotReadableException){ map.put("code", "400"); if(ex.getCause() instanceof InvalidFormatException){ InvalidFormatException formatException = (InvalidFormatException) ex.getCause(); List references = formatException.getPath(); if(!StringUtil.isEmptyList(references)){ String fileName = references.get(0).getFieldName(); map.put("msg", "参数:{"+fileName+"}格式错误"); }else{ map.put("msg", "参数格式错误"); } }else if(ex.getCause() instanceof JsonParseException || ex.getCause() instanceof JsonMappingException){ map.put("msg", "JSON格式错误"); }else { map.put("msg", "JSON格式错误"); } ex.printStackTrace(); } else { map.put("code", "99999"); map.put("msg", ex.getMessage()); ex.printStackTrace(); } return map; } /** * 拦截捕捉自定义异常 MyException.class * * @param ex * @return */ @ResponseBody @ExceptionHandler(value = GlobalException.class) public Map myErrorHandler(GlobalException ex) { Map map = new HashMap (); map.put("code", ex.getCode()); map.put("msg", ex.getMsg()); return map; } }
Controller 类
@ApiOperation(value = "编辑事项事项", notes = "编辑事项事项") @RequestMapping(value = "/modifyTemporaryMission", method = RequestMethod.POST) @Validated({ModifyCode.class}) public Response> modifyTemporaryMission(@RequestBody @Valid TemporaryMission temporaryMission, HttpServletRequest request){ String employeeId = GetResHeaderUtil.getEmployeeId(request); String estateId = GetResHeaderUtil.getEstateId(request); temporaryMission.setEmployeeId(employeeId); temporaryMission.setEstateId(estateId); temporaryMissionService.modifyTemporaryMission(AccessEntry.WEB,employeeId,temporaryMission); return new Response<>(); }
重要的是 @Valid ,这个会进入MethodArgumentNotValidException 异常
Model 类
package com.bdcourtyard.business.temporary.model; import com.bdcourtyard.business.temporary.assortmodel.InsertCode; import com.bdcourtyard.business.temporary.assortmodel.ModifyCode; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.Range; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.Valid; import javax.validation.constraints.*; import java.io.Serializable; import java.util.Set; /** * TemporaryMission * * @version : Ver 1.0 * @date : 2018-9-5 */ public class TemporaryMission implements Serializable { /** * */ private static final long serialVersionUID = 1L; /** * 事项ID */ @ApiModelProperty(value = "事项ID:{}新增非填,编辑必填") @NotEmpty(groups = {ModifyCode.class},message = "事项ID不能为空") @Null(groups = {InsertCode.class},message = "事项ID非填") private String missionId; /** * 内容 */ @ApiModelProperty(value = "内容",required = true) @NotBlank(message = "内容不能为空") @Length(min = 1,max = 500,message = "字符范围:1~500") private String content; /** * 执行时间类型:0每天1自定义 */ //@NotEmpty(message = "执行时间类型不能为空") @ApiModelProperty("执行时间类型:0每天 1自定义") @Range(min=0, max=1,message = "执行时间类型:有且仅有0或1") private Integer executeType; /** * 状态 0未完成1已完成2已关闭 */ @ApiModelProperty(value = "状态:{};0未完成 1已完成 2已关闭",hidden = true) @Range(min=0, max=2 ,message = "状态范围:整数:[0~2]") private Integer status; /** * 执行截止时间 */ @ApiModelProperty("执行截止时间") @DateTimeFormat(pattern="yyyy-MM-dd HH:mm") @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone="GMT+8") @Future(message = "执行截止时间必须大于当前时间") private java.util.Date endTime; /** * 发布人ID */ @ApiModelProperty(value = "发布人ID",hidden = true) private String employeeId; /** * 创建时间 */ @ApiModelProperty(value = "创建时间",hidden = true) @JsonFormat(pattern = "yyyy-MM-dd HH:mm",timezone="GMT+8") private java.util.Date createTime; /** * 楼盘id */ @ApiModelProperty(value = "楼盘id",hidden = true) private String estateId; //接收的(执行人) @ApiModelProperty(value = "接收的(执行人)ID") @Valid @NotEmpty(message = "执行人ID不能为空") @Size(min = 1, message = "至少要有一个执行人") private Setrecipient; //抄送的 @ApiModelProperty(value = "抄送的") private Set cclist; /** * @param missionId 事项ID */ public void setMissionId(String missionId) { this.missionId = missionId; } /** * @return 事项ID */ public String getMissionId() { return this.missionId; } /** * @param content 内容 */ public void setContent(String content) { this.content = content; } /** * @return 内容 */ public String getContent() { return this.content; } /** * @param endTime 执行截止时间 */ public void setEndTime(java.util.Date endTime) { this.endTime = endTime; } /** * @return 执行截止时间 */ public java.util.Date getEndTime() { return this.endTime; } /** * @param employeeId 发布人ID */ public void setEmployeeId(String employeeId) { this.employeeId = employeeId; } /** * @return 发布人ID */ public String getEmployeeId() { return this.employeeId; } /** * @param createTime 创建时间 */ public void setCreateTime(java.util.Date createTime) { this.createTime = createTime; } /** * @return 创建时间 */ public java.util.Date getCreateTime() { return this.createTime; } /** * @param estateId 楼盘id */ public void setEstateId(String estateId) { this.estateId = estateId; } /** * @return 楼盘id */ public String getEstateId() { return this.estateId; } public Integer getExecuteType() { return executeType; } public void setExecuteType(Integer executeType) { this.executeType = executeType; } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public Set getCclist() { return cclist; } public void setCclist(Set cclist) { this.cclist = cclist; } public Set getRecipient() { return recipient; } public void setRecipient(Set recipient) { this.recipient = recipient; } }
以上 :通过spring hibernate valid 注解实现。
注解大全:
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=) Validates that the annotated string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.
@Range(min=10000,max=50000,message="range.bean.wage")
private BigDecimal wage;
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
@ElementCollection(targetClass = String.class)