Service层方法返回值的最佳编程实践问题

spring项目三层结构中,service层的返回两种方案, 其调用分别对应于下列controller中的方法

方式一

@GetMapping("/getInfo")
public ResponseEntity<Info> getInfo(String productId) {
    Info info = infoService.getInfo(productId);
    return ResponseEntity.success(info);
}

方式二

@GetMapping("/getInfo")
public ResponseEntity<Info> getInfo(String productId) {
    return infoService.getInfo(productId);
}

大家一般用哪种? 第一种的话,如果infoService.getInfo(infoId)方法中有一些状况,譬如先根据productId查到product,然后再查info,结果发现productId查到product为null,需要返回

return ResponseEntity.fail(FAIL_MSG.CASH_LOAN_ORDER_UNFOUND);

如果用第一种,则需要再service方法中抛出异常,controller捕捉异常判断然后返回如上,二第二种方式可以直接在ervice方法中return ResponseEntity.fail(FAIL_MSG.CASH_LOAN_ORDER_UNFOUND),但是感觉service方法返回一个ResponseEntity怪怪的

阅读 8.5k
4 个回答

第一种
抛异常 + 全局异常处理

如果 ResponseEntity 的职责是给 Controller 返回值用的,那么不要让它侵入 Service 层。

认同第 一 种方法。

service 做校验,如果非法,直接抛异常 + 全局异常处理

controller 正常就是组合 service ,返回前端需要的数据。

两个问题。1,明确service的使用范围,如果仅限于controller,一和二都可以。如果service还可能被其它service调用,那么第二种不能满足使用。这种情况是第一种好。2,有些情况需要忽略service异常,进行下一步操作,如果采用不直接抛出异常的方法,那需要多一步判断操作,反正使用try catch就好,可读性更好。另外,代码重复性问题,很业余多异常需要做异常转换(至少要调用封装好的工具类),这种活可以在系统级别上使用切面或拦截器通知封装处理,开发更多去关注业余的就好。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题