Model全局异常捕获,返回json数据,参数格式转换,JSON转换问题,捕捉。

异常捕获类
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 Map errorHandler(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 Set recipient;

   //抄送的
   @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)

 

 

你可能感兴趣的:(Exception)