Java -避免在控制器上抛出指令



嗨,你好吗?

我有一个控制器调用调用Utils的方法的服务的方法,像这样:

控制器:

@RestController
@RequestMapping("/some-pattern")
public class SomeController {
@Autowired
SomeService service;
@PostMapping("/some-url")
public ResponseEntity<?> someMehhod(@RequestBody Object docs) {
service.someMethod(docs) ;
return new ResponseEntity<>(null, HttpStatus.OK);
}
}
服务:

@Service
public class SomeService {
@Autowired
SomeUtils utils;
public void someMethod(Object docs) throws SQLException{
//  THIS METHOD CAN RAISE AN SQL EXCEPTIO
utils.someMehhod(docs);
}
}

Util:

@Component
public class SomeUtils {
public void someMehhod(docs) throws SQLException {
// Some DB operation that need to try/catch or throw SQLException
}
}

我不介意只是抛出SQLException,我有一个处理程序类,将处理它,我的问题是,我要插入"抛出SQLException"在控制器方法,但这似乎对我来说是不对的,它是可以在控制器上有这个指令,或者我有办法避免它?我在想做'包装' SQLException到一个自定义异常扩展RuntimeException。观念?

方法签名中的throws SQLException是让开发人员意识到需要处理或至少确认(作为方法签名的一部分)的Java方法。这种类型的异常称为检查异常

"感觉控制器抛出异常是不对的";-你完全走对了路。这里有两个选项,可以捕获此异常并在Controller本身中转换为适当的HTTP代码,或者求助于可以处理这些异常的全局ControllerAdvice。我不会尝试将其转换为运行时异常,只是为了避免需要承认方法签名中的代码分支。

受控异常的有用性是一个有争议的话题。你会发现辩论双方的支持者。

如果这个检查异常让你思考如何处理它,那么checkedException就达到了它的目的,IMHO(我从golang生态系统中回来,语言让你处理每一个该死的错误路径,我看到检查异常的意义)

我认为在控制器中抛出异常也是可以的,但有2个建议:

  1. 使用try catch代替throw
  2. 如果您正在使用项目Lombok,请尝试@SneakyThrowshttps://projectlombok.org/features/SneakyThrows

最新更新