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