【问题标题】:Spring:DI with interface with implementation class less restrictive exceptionsSpring:DI 接口与实现类限制较少的异常
【发布时间】:2014-10-26 03:35:43
【问题描述】:

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

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

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

 }

【问题讨论】:

  • 用一些代码解释会帮助我们
  • 用一些代码编辑了我的问题。谢谢

标签: java spring interface dependency-injection


【解决方案1】:

更新

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

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

【讨论】:

  • 谢谢马雷克。我用一些代码编辑了我的问题。希望说明清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2013-03-14
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多