当我们在前端调用,因某些必传参数未传导致服务器报错500,这时候我们如何反馈给前端到底报什么错呢?
这时候就需要使用@ControllerAdvice去实现
Exception自定义
public class ResponseException extends RuntimeException {
public ResponseException(String message) {
super(message);
}
public ResponseException(String pattern, Object ... arguments) {
super(MessageFormat.format(pattern, arguments));
}
}
UnResponse返回实体类封装
- UnResponseBody封装
@Data
public class UnResponseBody {
private String code;
private String message;
private Object data;
}
- UnResponse封装
@Data
public class UnResponse {
@JSONField(name = "un_response")
@JsonProperty("un_response")
private UnResponseBody unResponseBody;
private String sign;
public static UnResponse error(String message) {
UnResponse unResponse = new UnResponse();
UnResponseBody unResponseBody = new UnResponseBody();
unResponseBody.setCode("-1");
unResponseBody.setMessage(message);
unResponse.setUnResponseBody(unBizResponse);
return unResonse;
}
public static unResponse saveDate(UnResponseBody unResponseBody) {
UnResonse unResonse = new UnResonse();
unResponse.setUnResponseBody(unBizResponse);
unResponse.setSign("");//签名就不放出来了
return unResponse;
}
}
GlobalExceptionHandler定义
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
public class GlobalExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
/**
*定义不同的Exception
*/
@ExceptionHandler(DataAccessException.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public UnResponse sqlException(DataAccessException e) {
logger.error("数据操作异常:", e);
return UnResponse.error(e.getMessage());
}
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(Exception.class)
@ResponseBody
public UnResponse exceptionHandler(Exception e, HttpServletRequest request) {
e.printStackTrace();
return UnResponse.error(e.getMessage());
}
}
server示例
@Override
@Transactional(rollbackFor = Exception.class)
public Object create(TestDto testDto) {
UnResponseBody unResponseBody = new UnResponseBody();
if(stringUtils.isEmpty(testDto.getId)){
throw new ResponseException('用户id不存在')
}
Test test = new Test();
test.setId(testDto.getId);
testService.insert(test);
retuen unResponseBody;
}
最后:这些都是一些基础的封装,各公司有各公司的封装习惯,我的封装仅供参考,如有雷应该是意外。