Controller 规范
1.统一返回值, 返回AbstractBean或PageBean
正确范例:
/**
* 获取国内省市区数据
* @param modelMap
* @param areaType
* @param parentId
* @return
*/
@GetMapping("/getLocalAddressArea")
@ResponseBody
public AbstractBean getLocalAddressArea(ModelMap modelMap,Integer areaType,Integer parentId) {
// 使用统一的返回值
AbstractBean bean = new AbstractBean();
try{
List<AddressArea> data = null;
if(0==areaType.intValue()){ // 所有省
data = addressAreaService.getAllProvinceList();
}else if(1==areaType.intValue()){ // 市
data = addressAreaService.getAppointCityList(parentId);
}else if(2==areaType.intValue()){ // 区
data = addressAreaService.getAppointRegionList(parentId);
}
bean.setStatus(EnumSvrResult.OK.getVal());
bean.setData(data);
return bean;
}catch(Exception e){
bean.setStatus(EnumSvrResult.OK.getVal());
bean.setMessage("获取国内省市区数据失败");
e.printStackTrace();
return bean;
}
}
错误范例:
@SuppressWarnings("rawtypes")
@GetMapping("/getAddressArea")
@ResponseBody
public Map<String,Object> getAddressArea(ModelMap modelMap,String term) {
// 不建议自定义返回值
Map<String,Object> result = new HashMap<String,Object>();
try{
if(StringUtils.isBlank(term)){
term = "广州市";
}
List data = templateExcelService.getByBasicAddressArea("addressArea", term);
result.put("status",EnumSvrResult.OK.getVal());
result.put("results",data);
return result;
}catch(Exception e){
e.printStackTrace();
result.put("status",EnumSvrResult.ERROR.getVal());
return result;
}
}
2. 尽量不在方法中直接进行异常处理并返回错误信息
建议: Service中抛出BusinessRuntiemException, 由AOP拦截统一处理并返回错误信息, 继承BaseController类实现统一的异常处理
错误范例:太多异常处理逻辑
@RequestMapping(value = "save", method = RequestMethod.POST)
@ResponseBody
@SysOperationLog(functionName="发票明细-保存")
@ApiDoc(AbstractBean.class)
public AbstractBean save(InvoiceDetailVos vos) {
AbstractBean bean = new AbstractBean();
SysUser currentUser = SessionUtil.getCurrentUser();
try {
iTInvoiceDetailService.saveInvoiceDetails(vos, currentUser.getId(), currentUser.getUserName(),
currentUser.getCompany().getCompanyCode(), currentUser.getCompany().getCompanyName());
bean.setStatus(EnumSvrResult.OK.getVal());
bean.setMessage(EnumSvrResult.OK.getName());
} catch (BusinessRuntimeException be)
// 不需要单独处理
bean.setStatus(EnumSvrResult.ERROR.getVal());
bean.setMessage(be.getErrReason());
} catch (Exception e) {
// 不需要单独处理
e.printStackTrace();
bean.setStatus(EnumSvrResult.ERROR.getVal());
bean.setMessage(EnumSvrResult.ERROR.getName());
}
return bean;
}
3. 方法的入参和出参统一由AOP进行日志打印
4. Controller做参数格式的转换,不允许把json,map这类对象传到Service去,也不允许Service返回json、map
Service 规范
异常处理规范
1. 尽量用logger.error("操作+实体名称", e)打印异常信息
正确范例:
public void createXXX(){
try {
// 业务逻辑
}
catch (IOException ioe) {// 有必须处理的异常
logger.error("新建XXX失败", ioe);
throw new BusinessRuntimeException("", "新建XXX失败"); // 重新包装为业务异常
}
}
2. Service中一般不处理业务异常,统一抛到Controller处理
参考事项1中的正确范例
3. 不建议try catch 一大段代码,应只针对可能出现异常的地方进行 try catch
错误范例:
public DmsResponse methodXXX (){
try {
// 一大段业务逻辑
}
catch (Exception e) {
e.printStackTrace();
return new DmsResponse(errCode, e.getMessage());
}
}
4. 定时作业异常、后台执行代码出现的异常需要发送邮件或微信进行提醒
5. 如果是以Dubbo方式调用, 统一在Dubbo的服务中进行异常处理并返回,不在下层Service中处理异常
DmsQuotationService // 在该层处理异常
-- QuoteQuotationService
网友评论