【问题标题】:How inject new implementation of a SDK interface?如何注入 SDK 接口的新实现?
【发布时间】:2020-03-27 12:01:06
【问题描述】:

我正在使用 Atlassian SDK 创建插件。在此 SDK 中有一个接口及其实现,用于获取有关编辑器的一些数据。我在这个接口上创建了一个新的实现,我想将它注入到我的其他类中。但是当我定义@Component@Named 时,我得到了很多关于Thread 和Runnable 的错误。

我的问题是,是否可以注入您无权访问的接口的另一个实现及其默认实现代码(在 SDK 中)。如果是,我做得对吗?或者我可以通过从默认实现扩展我的植入来解决它吗?

@ExperimentalApi
public interface FieldHtmlFactory {
    List<FieldHtmlBean> getCreateFields(ApplicationUser var1, OperationContext var2, Action var3, MutableIssue var4, boolean var5, List<String> var6);

    List<FieldHtmlBean> getLinkedIssueCreateFields(ApplicationUser var1, OperationContext var2, Action var3, MutableIssue var4, Issue var5, boolean var6, List<String> var7);

    List<FieldHtmlBean> getEditFields(ApplicationUser var1, OperationContext var2, Action var3, Issue var4, boolean var5);

    List<FieldHtmlBean> getInlineEditFields(ApplicationUser var1, OperationContext var2, Action var3, Issue var4, boolean var5);

    List<FieldHtmlBean> getSubTaskCreateFields(ApplicationUser var1, OperationContext var2, Action var3, MutableIssue var4, boolean var5, List<String> var6);
}

默认实现:(没有任何注释)

public class FieldHtmlFactoryImpl implements FieldHtmlFactory {...}

我的实现:

@Scanned
@Named("editorImpl")
public class FieldEditorFactoryImpl implements FieldHtmlFactory { ... }

我想使用的地方:

@Scanned
@Path("/table")
public class TableREST {

    @Inject
    @Named("editorImpl")
    private final FieldHtmlFactory fieldEditorFactoryImpl;

    @Autowired
    public TableREST(FieldHtmlFactory editorImp){
        this.editorImp = editorImp;
    }

    ...
}

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    我做到了。我想为谁可能需要它的解决方案...

    我从默认实现扩展了我的类(而不是实现接口)。然后我可以为它定义命名注释。

    @Named("FieldEditorFactoryImpl")
    public class FieldEditorFactoryImpl extends FieldHtmlFactoryImpl {
    
        public FieldEditorFactoryImpl(BeanFactory beanFactory, FieldManager fieldManager, FieldScreenRendererFactory fieldScreenRendererFactory, PermissionManager permissionManager) {
            super(beanFactory, fieldManager, fieldScreenRendererFactory, permissionManager);
        }
    
        public String sayHelloWorld(){
            return "Hello World!";
        }
    }
    
    @Scanned
    @Path("/table")
    public class TableREST {
    
        private FieldEditorFactoryImpl fieldEditorFactoryImpl;
    
        @Autowired
        public TableREST(@Named("FieldEditorFactoryImpl") FieldHtmlFactory fieldHtmlFactory){
            this.fieldEditorFactoryImpl = (FieldEditorFactoryImpl) fieldHtmlFactory;
        }
    
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 2019-04-09
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      相关资源
      最近更新 更多