自定義返回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( )方法來獲取自定義的中文提示信息