自定义返回VO 和自定义异常类
自定义返回VO
@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;
}
自定义异常类,不提供无参构造器,不允许抛出一个不指明原因的自定义异常
public class NotFoundException extends BizException {
public NotFoundException(String message) {
super(message);
}
}
全局异常处理类中,主要会用到的注解有:
@ControllerAdvice("扫描的包目录") 使用在类上定义全局处理类, 覆盖指定包目录下,含注解 @RequestMapping的接口方法
@ExceptionHandler(value = RuntimeExcpetion.class) 声明异常处理方法。处理声明的异常类及其子类。 如不定义value属性值,则默认处理方法参数对应的异常类型。
@ResponseStatus(HttpStatus.OK) 声明该异常处理 http响应的状态, 为200 ok
@ResponseBody 与视图层controller类中的一样,把返回值处理为Json格式,响应给前台
全局异常处理类
/**
* 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()));
}
}
此处用到了
@Autowired private MessageSource messageSource;
MessageSource 是spring提供获取国际化信息的接口,messageSource.getMessage( )方法来获取自定义的中文提示信息