我有一个实现类,它捕获接口(interface)方法的所有声明的异常。当我在类中注入(inject)并使用 Interface 实例变量并希望调用实现方法时,我自然会收到编译器错误,指出我需要抛出/捕获在父级中声明的异常。
我想到的选项很少有这些,但我不喜欢它们。只是想知道解决此问题的最佳方法。
- 将接口(interface)实例转换为 impl
- 使用无异常(exception)的方法创建子接口(interface)
- 可能只是没有在接口(interface)中声明异常。只需捕获 impl 中所有可能的异常即可。
编辑1:附加一些示例代码
public interface ServiceUtilInterface {
public abstract String getMessage(String ID) throws CustomException;
}
@Component(value="MyServiceUtil")
public class MyServiceUtil implements ServiceUtilInterface {
@Override
public String getMessage(String ID) {
try{
//do something
}catch(CustomException e){
}
return "";
}
@Component
public class Usage {
@Autowired
ServiceUtilInterface serviceUtil;
public void someMethod(){
serviceUtil.getMessage("123");
//This where compiler expects me to throw /catch the exception defined in interface
}
}
最佳答案
更新
将接口(interface)实例转换为 impl - 永远不要这样做。如果您使用 Spring,那么您永远不知道接口(interface)的实现是什么。这应该取决于配置。 如果您开始编写 jUnits,您可能需要使用模拟(假)组件进行测试。然后,如果您尝试将模拟转换为具体实现,您的代码将会失败。换句话说,您将永远无法编写正确的单元测试。另一件事是,如果您添加一些方面或创建一个服务@Transactional或@Validated,那么您将无法进行转换,因为您可能会收到一个代理对象,而不是您的实现。
和 3 很大程度上取决于您的代码设计。尝试找到一些有关抛出和处理异常的良好实践的 Material 。对此有一些一般规则。可能没有人可以帮助您解决此问题,因为这是特定于服务的。
关于java - Spring:具有接口(interface)和实现类的DI,限制较少的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25613752/