我有一个实现类,它捕获Interface的方法的所有声明的异常。当我在一个类中注入并使用Interface实例变量并希望调用实现方法时 - 我自然会得到一个编译器错误,指出我需要抛出/捕获在parent中声明的异常。
我想到的几个选项都是这些,但我不喜欢它们。只是想知道解决这个问题的最佳方法。
编辑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
}
}
答案 0 :(得分:1)
更新
将接口实例强制转换为impl - 永远不要这样做。如果您使用Spring,那么您永远不知道接口的实现是什么。这应该取决于配置。 如果你开始编写jUnits,你可能需要使用mock(假)组件进行测试。然后,如果您尝试将模拟转换为具体实现,则代码将失败。换句话说,你永远无法编写适当的单元测试。另一件事是,如果您添加一些Aspects或制作服务@Transactional或@Validated,那么您将无法投射,因为您可能会收到代理对象,而不是您的实现。
和3很大程度上取决于您的代码设计。尝试找到有关抛出和处理异常的良好实践的一些材料。关于这一点有一些一般规则。可能没有人可以帮助你,因为这是特定于服务的。