java - Spring:具有接口(interface)和实现类的DI,限制较少的异常

标签 java spring interface dependency-injection

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

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

  1. 将接口(interface)实例转换为 impl
  2. 使用无异常(exception)的方法创建子接口(interface)
  3. 可能只是没有在接口(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
   }

 }

最佳答案

更新

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

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

关于java - Spring:具有接口(interface)和实现类的DI,限制较少的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25613752/

相关文章:

ruby-on-rails - 让最终用户在 Rails 中指定排序顺序的最佳方式

java - Kotlin - 作为尾随 Lambda 的接口(interface)

java - 当继承不是一种选择时如何实现重复行为

java - 向打开浏览器 URL 的 Activity 添加按钮

java - 将 Java 转换为 Objective-C

java - 为什么多次加0.1仍然无损?

java - 映射表丢失@manyToMany中的非唯一ID

java - 如何在 3 个不同的 osgi 包(即 3 个不同的 java 插件项目)中使用相同的对象

java - 使用 Jackson 库更改派生类的 JSON 属性名称

java - 使用 tools.jar 作为依赖项使用 java -jar 运行 spring boot