spring boot 實現 異常處理機制

自定義返回VO 和自定義異常類java

 自定義返回VOspring

@ApiModel(description = "返回Vo")
public class ResponseVO<V> {

    @ApiModelProperty(value = "異常Code,可選", example = "null")
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String errorCode = "0";

    @ApiModelProperty("業務是否成功")
    private boolean success;
    @ApiModelProperty("分字段出錯信息,例如表單中某一個字段")
    private List<FieldExceptionVO> fieldErrors;
    @ApiModelProperty("全局出錯信息")
    private String msg;
    @ApiModelProperty("返回內容")
    private V data;
}

自定義異常類,不提供無參構造器,不容許拋出一個不指明緣由的自定義異常app

public class NotFoundException extends BizException {
    public NotFoundException(String message) {
        super(message);
    }
}

 

全局異常處理類中,主要會用到的註解有: spa

        @ControllerAdvice("掃描的包目錄")  使用在類上定義全局處理類, 覆蓋指定包目錄下,含註解    @RequestMapping的接口方法code

        @ExceptionHandler(value = RuntimeExcpetion.class)  聲明異常處理方法。處理聲明的異常類及其子類。 如不定義value屬性值,則默認處理方法參數對應的異常類型。接口

        @ResponseStatus(HttpStatus.OK) 聲明該異常處理 http響應的狀態, 爲200 okip

        @ResponseBody  與視圖層controller類中的同樣,把返回值處理爲Json格式,響應給前臺get

全局異常處理類it

/**
 * WEB異常處理器
 */
@ControllerAdvice("com.fastcast.user")
public class WebExceptionHandler {

    static Logger LOG = LoggerFactory.getLogger(WebExceptionHandler.class);

    @Autowired
    private MessageSource messageSource;

    @ExceptionHandler(value = FieldException.class)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public ResponseVO<Object> handleFieldException(FieldException e) {
        ResponseVO<Object> vo = new ResponseVO<>();
        if (CollectionUtils.isNotEmpty(e.getFieldErrors())) {
            for (FieldExceptionItem item : e.getFieldErrors()) {
                String itemMessage = item.getMessage();
                try {
                    itemMessage = messageSource.getMessage(item.getMessage(), item.getArgs(),
                            LocaleContextHolder.getLocale());
                } catch (NoSuchMessageException ex) {
                    ; // ignore
                }
                vo.addFieldError(item.getField(), itemMessage);
            }
        }
        return vo;
    }

    /**
     * 填充異常響應消息
     *
     * @param e
     * @param vo
     */
    private void fillExceptionVO(Exception e, ResponseVO<Object> vo) {
        BizException se = (BizException) e;
        if (se.getMessage() != null) {
            String message = e.getMessage();
            try {
                message = messageSource.getMessage(e.getMessage(), se.getArgs(), LocaleContextHolder.getLocale());
            } catch (NoSuchMessageException ex) {
                LOG.warn("no such message key:" + e.getMessage());
            }
            vo.setMsg(message);
        }
        vo.setErrorCode(se.getErrorCode() == null ? null : String.valueOf(se.getErrorCode()));
    }
}

此處用到了io

@Autowired
private MessageSource messageSource;

MessageSource 是spring提供獲取國際化信息的接口,messageSource.getMessage( )方法來獲取自定義的中文提示信息

相關文章
相關標籤/搜索