talend自定义组件中的动态下拉列表

时间:2017-04-11 12:11:11

标签: talend

我正在为talend编写自定义组件。我想在组件设置中添加一个下拉列表。我需要使用给定的主机ID和密码从服务器添加列表项,例如:

  1. 主机名
  2. 密码
  3. 下拉
  4. 用户填写1和2后,将使用主机响应填充下拉列表。

    我尝试搜索talend文档中的相关内容但未找到

    任何人都可以建议我如何实现此功能,或者可以开发吗?

    我做的方法建议创建一个插件并安装到TOS / plugins添加标头扩展名。当我试图将组件推送到调色板Talend时,错误

    java.lang.Exception:Component TalendDynamicList加载错误。 因为异常:在org.talend.core.external_component上找到的扩展数量不正确。期望在1和1之间但是找到0。

    at org.talend.designer.core.model.components.EmfComponent.load(EmfComponent.java:398)
    
    at org.talend.designer.core.model.components.EmfComponent.<init>(EmfComponent.java:243)
    
    at org.talend.designer.codegen.components.model.ComponentsFactory.loadComponentsFromFolder(ComponentsFactory.java:503)
    
    at org.talend.designer.codegen.components.model.ComponentsFactory.loadComponents(ComponentsFactory.java:296)
    
    at org.talend.designer.codegen.components.model.ComponentsFactory.loadComponentsFromComponentsProviderExtension(ComponentsFactory.java:280)
    
    at org.talend.designer.codegen.components.model.ComponentsFactory.init(ComponentsFactory.java:179)
    
    at org.talend.designer.codegen.components.model.ComponentsFactory.getComponents(ComponentsFactory.java:801)
    
    at org.talend.librariesmanager.model.service.LocalLibraryManager.deployComponentAndExtensionLibs(LocalLibraryManager.java:1133)
    
    at org.talend.librariesmanager.model.service.JavaLibrariesService.syncLibraries(JavaLibrariesService.java:227)
    
    at org.talend.librariesmanager.model.service.LibrariesService.syncLibraries(LibrariesService.java:128)
    
    at org.talend.designer.codegen.CodeGeneratorService.refreshTemplates(CodeGeneratorService.java:156)
    
    at org.talend.componentdesigner.ui.action.provider.PushToPaletteActionProvider$PushToPaletteAction.run(PushToPaletteActionProvider.java:181)
    
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:519)
    
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595)
    
    at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:511)
    
    at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:420)
    
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
    
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4353)
    
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1061)
    
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4172)
    
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3761)
    
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1151)
    
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032)
    
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148)
    
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636)
    
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
    
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579)
    
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
    
    at org.talend.rcp.intro.Application.start(Application.java:243)
    
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
    
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
    
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    
    at java.lang.reflect.Method.invoke(Method.java:497)
    
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
    
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
    
    at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
    

    引起:java.lang.RuntimeException:plugin:org.talend.designer.plsap not found

    at org.talend.core.model.repository.ExternalNodesFactory.getInstance(ExternalNodesFactory.java:38)
    
    at org.talend.designer.core.model.components.EmfComponent.load(EmfComponent.java:396)
    
    ... 41 more
    

    引起:org.talend.commons.exception.IllegalPluginConfigurationException:在org.talend.core.external_component上找到的扩展数量不正确。期望在1和1之间但是找到0。

    at org.talend.commons.utils.workbench.extensions.ExtensionImplementationProvider.createInstances(ExtensionImplementationProvider.java:193)
    
    at org.talend.commons.utils.workbench.extensions.ExtensionImplementationProvider.getInstance(ExtensionImplementationProvider.java:143)
    
    at org.talend.core.model.repository.ExternalNodesFactory.getInstance(ExternalNodesFactory.java:36)
    
    ... 42 more
    

    如果可能,然后分享插件模板,我试着按照

      

    https://www.talendforge.org/forum/viewtopic.php?id=38165和   http://community.jaspersoft.com/wiki/jaspersoft-etl-plugin-create-talend-plugin

    两者都有相同的错误请帮助

2 个答案:

答案 0 :(得分:0)

这是可行的,但你必须完全开箱即用。而不是在组件内部解决它,您可以拥有可以与您的组件通信的STUDIO扩展。

我在talend论坛上对此进行了解释,所以这是一个非常复制的粘贴。 http://www.talendforge.org/forum/viewtopic.php?id=9439 https://www.talendforge.org/forum/viewtopic.php?id=38165

由于我觉得我的帖子只是一个更大的开头,我想开一个新主题,在那里我可以发布我的其他发现。 这是我对该主题的原始答案:(随意让它变得更好)

到目前为止,以下似乎有效: 这是基于ssps扩展,我用作基础。为什么?因为它在GUI上有2个参数,它只是&#34;只是&#34;将文件解析为talend元数据。

入门:

  1. 首先,我们需要一个eclipse开发环境。以下指南准确无误。 (别担心,我们不会从SVN运行Talend) http://www.talendforge.org/wiki/doku.php?id=dev:run_from_svn
  2. 然后我们需要创建自己的扩展。 与组件相同:使用现有组件作为基础。 没有深入的技术细节:我们有一个接口和一个java程序。 java程序有一个由gui触发的main(String args)函数。
  3. 设置组件: 您需要在组件中添加以下条目: 对HEADER标记插入:EXTENSION="org.talend.designer.plsap" 所以它看起来像:
  4. <HEADER EXTENSION="org.talend.designer.plsap" PLATEFORM="ALL" ....>
    
    1. 我们还需要组件XML中的自定义按钮:
    2. <PARAMETER NAME="MAP" FIELD="EXTERNAL" NUM_ROW="89">
      <DEFAULT />
      </PARAMETER>
      

      创建扩展程序JAR!

      1. 在开始之前,我们需要编辑清单文件:
      2. 必须使用自定义ID,以及“扩展”选项卡的正确配置。
      3. 现在让我们安装它,为此我们需要一个JAR文件。对我来说这是一个棘手的部分(我花了大约4-5个小时来完成整个工作,这也包括SVN结账):
      4. 当您导出扩展程序时,请不要直接完成。
      5. 单击下一步 - 下一步,直到到达清单部分: 在这里,您需要添加组件清单文件,而不是由eclipse生成的文件。
      6. 安装扩展程序JAR!

        1. 转到要应用此&#34;扩展程序&#34;的talend安装。
        2. 导出的jar应该放在plugins文件夹下。
        3. 找到以下文件: features\org.talend.tos.components-feature_5.4.1.r111943\features.xml 在这里,我添加了以下条目:
        4.    <plugin
                   id="org.talend.designer.plsap"
                   download-size="0"
                   install-size="0"
                   version="5.4.1.r111943"
                   unpack="false"/>
          
          1. 如果是Talend Enterprise,请在<studio>\configuration\org.talend.configurator下创建一个extrabundles.info文件 内容应该是:
          2. org.talend.designer.plsap,5.4.1.r111943,插件/ org.talend.designer.plsap_5.4.1.r111943.jar,4,假

            1. 删除以下文件夹:
              • \配置\ org.eclipse.core.runtime
              • \配置\ org.eclipse.equinox.app
              • \配置\ org.eclipse.osgi
              • \配置\的org.eclipse.update
            2. 获利,你已经完成了!
            3. 它是如何运作的?

              每当您在GUI上单击该按钮时,将调用java程序,它可以获取/设置组件的参数。 我还有一些要做/检查: 我不确定是否传递参数NAME = value。 我不确定我们是否可以启动任何类型的外部java程序。

              <强>疑难解答:

              • Talend无法加载组件:确保在plugin.xml中使用的features.xml中使用相同的版本

              我会尝试从实际的java代码中挖掘一些代码,以便我们与组件进行交互。

答案 1 :(得分:-1)

我在Talend git存储库中找到了解决方案, 您可以按照以下步骤创建自定义组件

  1. 在您的计算机上设置maven和java
  2. 转到您的工作区并运行以下命令

    mvn org.apache.maven.plugins:maven-archetype-plugin:2.4:generate -DarchetypeGroupId=org.talend.components -DarchetypeArtifactId=input-component-archetypes -DarchetypeVersion=0.20.0-SNAPSHOT  -DarchetypeRepository=https://artifacts-oss.talend.com/nexus/content/repositories/TalendOpenSourceRelease/
    
  3. 同时你的命令正在运行它会问你几个问题,比如组件名称和版本等。

  4. 完成命令后,它会为您生成输入组件模板

  5. 在命令中有 DarchetypeVersion 版本,如果需要不同版本,可以更改

     -DarchetypeVersion=0.20.0-SNAPSHOT 
    

    就我而言,我正在使用

     -DarchetypeVersion=0.16.0-SNAPSHOT 
    
  6. 现在只需找到组件的POM.XML文件并运行命令

      mvn install
    
  7. 此命令将编译源代码并生成几个具有不同分类器的jar文件。 jar和bundle
  8. 在编译过程中你可能会有错误,现在删除测试类。
  9. 编译源代码后,将bundle jar文件复制到Talend root-&gt; plugins
  10. 重新启动Talend Studio
  11. 重新启动Talend后,在调色板中搜索您的组件
  12. 在调色板中找到组件后,下一步就是在组件中添加动态下拉列表。 按照步骤

    1. 在源代码中搜索文件.properties.java
    2. 定义属性

          public Property<List<NamedThing>> dropdown = newProperty(new 
          TypeLiteral<List<NamedThing>>() {
      
          }, "dropdown");
      
      
          public List<String> items = new ArrayList<>();
      
    3. 这将创建组件配置的下拉列表 4填充值,首先在类型中添加项目 5然后在 refreshLayout函数上添加以下代码

          dropdown.setPossibleValues(items);
      
    4. 现在再次构建源代码并在talend插件中安装bundle.jar。 您将看到动态下拉列表