Spring:带接口的DI,实现类限制性较少的异常

时间:2014-09-01 22:55:22

标签: java spring interface dependency-injection

我有一个实现类,它捕获Interface的方法的所有声明的异常。当我在一个类中注入并使用Interface实例变量并希望调用实现方法时 - 我自然会得到一个编译器错误,指出我需要抛出/捕获在parent中声明的异常。

我想到的几个选项都是这些,但我不喜欢它们。只是想知道解决这个问题的最佳方法。

  1. 将接口实例强制转换为impl
  2. 使用无异常的方法创建子接口
  3. 可能只是在Interface中没有声明异常。只需捕获impl中的所有可能异常。
  4. 编辑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
       }
    
     }
    

1 个答案:

答案 0 :(得分:1)

更新

  1. 将接口实例强制转换为impl - 永远不要这样做。如果您使用Spring,那么您永远不知道接口的实现是什么。这应该取决于配置。 如果你开始编写jUnits,你可能需要使用mock(假)组件进行测试。然后,如果您尝试将模拟转换为具体实现,则代码将失败。换句话说,你永远无法编写适当的单元测试。另一件事是,如果您添加一些Aspects或制作服务@Transactional或@Validated,那么您将无法投射,因为您可能会收到代理对象,而不是您的实现。

  2. 和3很大程度上取决于您的代码设计。尝试找到有关抛出和处理异常的良好实践的一些材料。关于这一点有一些一般规则。可能没有人可以帮助你,因为这是特定于服务的。