使用Java API调用AEM Forms invoking-aem-forms-using-the-javaapi

本文档中的示例和示例仅适用于JEE环境上的AEM Forms。

可以使用AEM Forms Java API调用AEM Forms。 使用AEM Forms Java API时,您可以使用调用API或Java客户端库。 Java客户端库可用于Rights Management服务等服务。 这些强类型的API允许您开发调用AEM Forms的Java应用程序。

调用API是com.adobe.idp.dsc包中的类。 使用这些类,您可以直接向服务发送调用请求,并处理返回的调用响应。 使用调用API可调用使用Workbench创建的短期或长期进程。

以编程方式调用服务的推荐方法是使用与服务相对应的Java客户端库,而不是调用API。 例如,要调用加密服务,请使用加密服务客户端库。 要执行Encryption服务操作,请调用属于Encryption服务客户端对象的方法。 您可以通过调用EncryptionServiceClient对象的encryptPDFUsingPassword方法,使用密码加密PDF文档。

Java API支持以下功能:

  • 用于远程调用的RMI传输协议
  • 本地调用的VM传输
  • 用于远程调用的SOAP
  • 不同的身份验证,如用户名和密码
  • 同步和异步调用请求

包括AEM Forms Java库文件

调用以人为中心的长期进程

使用Web服务调用AEM Forms

设置连接属性

使用Java API将数据传递到AEM Forms服务

使用Java客户端库调用服务

使用调用API调用短期进程

创建可调用以人为中心的长期进程的Java Web应用程序

包括AEM Forms Java库文件 including-aem-forms-java-library-files

要使用Java API以编程方式调用AEM Forms服务,请在Java项目的类路径中包含所需的库文件(JAR文件)。 包含在客户端应用程序类路径中的JAR文件取决于几个因素:

  • 要调用的AEM Forms服务。 客户端应用程序可以调用一个或多个服务。
  • 要用于调用AEM Forms服务的模式。 可以使用EJB或SOAP模式。 (请参阅设置连接属性。)
NOTE
(仅全包式)使用命令standalone.bat -b <Server IP> -c lc_turnkey.xml启动AEM Forms服务器以指定EJB的服务器IP
  • 部署AEM Forms的J2EE应用程序服务器。

特定于服务的JAR文件 service-specific-jar-files

下表列出了调用AEM Forms服务所需的JAR文件。

文件
描述
位置
adobe-livecycle-client.jar
必须始终包含在Java客户端应用程序的类路径中。
<安装目录>/sdk/client-libs/common
adobe-usermanager-client.jar
必须始终包含在Java客户端应用程序的类路径中。
<安装目录>/sdk/client-libs/common
adobe-utilities.jar
必须始终包含在Java客户端应用程序的类路径中。
<安装目录>/sdk//client-libs/<应用程序服务器>
adobe-applicationmanager-client-sdk.jar
调用应用程序管理器服务时需要。
<安装目录>/sdk/client-libs/common
adobe-assembler-client.jar
调用Assembler服务时需要。
<安装目录>/sdk/client-libs/common
adobe-backup-restore-client-sdk.jar
调用备份和还原服务API时需要此项。
<安装目录>/sdk/client-libs/common
adobe-barcodedforms-client.jar
调用条形码表单服务时需要。
<安装目录>/sdk/client-libs/common
adobe-convertpdf-client.jar
需要此项才能调用转换PDF服务。
<安装目录>/sdk/client-libs/common
adobe-distiller-client.jar
调用Distiller服务时需要此项。
<安装目录>/sdk/client-libs/common
adobe-docconverter-client.jar
调用DocConverter服务时需要。
<安装目录>/sdk/client-libs/common
adobe-contentservices-client.jar
需要此项才能调用文档管理服务。
<安装目录>/sdk/client-libs/common
adobe-encryption-client.jar
调用加密服务时需要。
<安装目录>/sdk/client-libs/common
adobe-forms-client.jar
调用Forms服务时需要此项。
<安装目录>/sdk/client-libs/common
adobe-formdataintegration-client.jar
需要此项才能调用表单数据集成服务。
<安装目录>/sdk/client-libs/common
adobe-generatepdf-client.jar
需要此项才能调用生成PDF服务。
<安装目录>/sdk/client-libs/common
adobe-generate3dpdf-client.jar
需要调用生成3DPDF服务。
<安装目录>/sdk/client-libs/common
adobe-jobmanager-client-sdk.jar
调用作业管理器服务时需要此项。
<安装目录>/sdk/client-libs/common
adobe-output-client.jar
调用Output服务时需要。
<安装目录>/sdk/client-libs/common
adobe-pdfutility-client.jar
调用PDF实用程序或XMP实用程序服务时需要此项。
<安装目录>/sdk/client-libs/common
adobe-reader-extensions-client.jar
调用Acrobat Reader DC扩展服务时需要此项。
<安装目录>/sdk/client-libs/common

adobe-repository-client.jar

commons-codec-1.3.jar

调用存储库服务时需要此项。

<安装目录>/sdk/client-libs/common

<安装目录>/sdk/client-libs\thirdparty

  • adobe-rightsmanagement-client.jar

  • namespace.jar

  • jaxb-api.jar

  • jaxb-impl.jar

  • jaxb-libs.jar

  • jaxb-xjc.jar

  • relaxngDatatype.jar

  • xsdlib.jar

调用Rights Management服务时需要。

如果AEM Forms部署在JBoss上,请包含所有这些文件。

<安装目录>/sdk/client-libs/common

特定于JBoss的库目录

adobe-signatures-client.jar
调用Signature服务时需要。
<安装目录>/sdk/client-libs/common
adobe-taskmanager-client-sdk.jar
需要此项才能调用任务管理器服务。
<安装目录>/sdk/client-libs/common
adobe-truststore-client.jar
调用信任存储区服务时需要此项。
<安装目录>/sdk/client-libs/common

连接模式和J2EE应用程序JAR文件 connection-mode-and-j2ee-application-jar-files

下表列出了与连接模式以及部署AEM Forms的J2EE应用程序服务器相关的JAR文件。

文件
描述
位置
  • activation.jar

  • axis.jar

  • commons-codec-1.3.jar

  • commons-collections-3.1.jar

  • commons-discovery.jar

  • commons-logging.jar

  • dom3-xml-apis-2.5.0.jar

  • jaxen-1.1-beta-9.jar

  • jaxrpc.jar

  • log4j.jar

  • mail.jar

  • saaj.jar

  • wsdl4j.jar

  • xalan.jar

  • xbean.jar

  • xercesImpl.jar
  • commons-httpclient-3.1.jar
如果使用SOAP模式调用AEM Forms,请包含这些JAR文件。
<安装目录>/sdk/client-libs/thirdparty
jboss-client.jar

如果AEM Forms部署在JBoss应用程序服务器上,请包含此JAR文件。

如果jboss-client.jar和引用的jar不在同一位置,则类加载器将无法找到所需的类。

JBoss客户端库目录

如果将客户端应用程序部署在同一J2EE应用程序服务器上,则不需要包含此文件。

wlclient.jar
如果AEM Forms部署在BEA WebLogic Server®上,则包含此JAR文件。

特定于WebLogic的库目录

如果将客户端应用程序部署在同一J2EE应用程序服务器上,则不需要包含此文件。

  • com.ibm.ws.admin.client_6.1.0.jar

  • com.ibm.ws.webservices.thinclient_6.1.0.jar

  • 如果AEM Forms部署在WebSphere应用程序服务器上,则包含这些JAR文件。

  • (Web服务调用需要com.ibm.ws.webservices.thinclient_6.1.0.jar)。

特定于WebSphere的lib目录([WAS_HOME]/runtime)

如果将客户端应用程序部署在同一J2EE应用程序服务器上,则不必包含这些文件。

调用方案 invoking-scenarios

下表指定了调用方案,并列出了成功调用AEM Forms所需的JAR文件。

服务
调用模式
J2EE应用程序服务器
必需的JAR文件
Forms服务
EJB
Jboss
  • adobe-livecycle-client.jar

  • adobe-usermanager-client.jar

  • jboss-client.jar
  • adobe-forms-client.jar
  • commons-httpclient-3.1.jar

Forms服务

Acrobat Reader DC扩展服务

签名服务

EJB
Jboss
  • adobe-livecycle-client.jar

  • adobe-usermanager-client.jar

  • jboss-client.jar
  • commons-httpclient-3.1.jar
  • adobe-forms-client.jar

  • adobe-reader-extensions-client.jar

  • adobe-signatures-client.jar

Forms服务
SOAP
WebLogic
  • adobe-livecycle-client.jar

  • adobe-usermanager-client.jar

  • wlclient.jar

  • activation.jar

  • axis.jar

  • commons-codec-1.3.jar

  • commons-collections-3.1.jar

  • commons-discovery.jar

  • commons-logging.jar

  • dom3-xml-apis-2.5.0.jar

  • jai_imageio.jar

  • jaxen-1.1-beta-9.jar

  • jaxrpc.jar

  • log4j.jar

  • mail.jar

  • saaj.jar

  • wsdl4j.jar

  • xalan.jar

  • xbean.jar

  • xercesImpl.jar

  • adobe-forms-client.jar

Forms服务

Acrobat Reader DC扩展服务

签名服务

SOAP
WebLogic
  • adobe-livecycle-client.jar

  • adobe-usermanager-client.jar

  • wlclient.jar

  • activation.jar

  • axis.jar

  • commons-codec-1.3.jar

  • commons-collections-3.1.jar

  • commons-discovery.jar

  • commons-logging.jar

  • dom3-xml-apis-2.5.0.jar

  • jai_imageio.jar

  • jaxen-1.1-beta-9.jar

  • jaxrpc.jar

  • log4j.jar

  • mail.jar

  • saaj.jar

  • wsdl4j.jar

  • xalan.jar

  • xbean.jar

  • xercesImpl.jar

  • adobe-forms-client.jar

  • adobe-reader-extensions-client.jar

  • adobe-signatures-client.jar

升级JAR文件 upgrading-jar-files

如果从LiveCycle升级到AEM Forms,建议在Java项目的类路径中包含AEM Forms JAR文件。 例如,如果您使用的是Rights Management服务等服务,但是如果在类路径中不包含AEM Forms JAR文件,则会遇到兼容性问题。

假定您要升级到AEM Forms。 要使用调用Rights Management服务的Java应用程序,请包含以下JAR文件的AEM Forms版本:

  • adobe-rightsmanagement-client.jar
  • adobe-livecycle-client.jar
  • adobe-usermanager-client.jar

另请参阅

使用Java API调用AEM Forms

设置连接属性

使用Java API将数据传递到AEM Forms服务

使用Java客户端库调用服务

设置连接属性 setting-connection-properties

您可以设置连接属性,以便在使用Java API时调用AEM Forms。 设置连接属性时,指定是远程调用服务还是本地调用服务,并指定连接模式和身份验证值。 如果启用了服务安全,则需要身份验证值。 但是,如果禁用了服务安全性,则不必指定身份验证值。

连接模式可以是SOAP或EJB模式。 EJB模式使用RMI/IIOP协议,EJB模式的性能优于SOAP模式。 SOAP模式用于消除J2EE应用程序服务器依赖关系,或者当防火墙位于AEM Forms和客户端应用程序之间时。 SOAP模式使用https协议作为底层传输,并且可以跨防火墙边界进行通信。 如果J2EE应用程序服务器依赖关系或防火墙都不是问题,建议您使用EJB模式。

要成功调用AEM Forms服务,请设置以下连接属性:

  • DSC_DEFAULT_EJB_ENDPOINT: ​如果您使用EJB连接模式,此值表示部署AEM Forms的J2EE应用程序服务器的URL。 要远程调用AEM Forms,请指定部署AEM Forms的J2EE应用程序服务器名称。 如果您的客户端应用程序位于同一J2EE应用程序服务器上,则可以指定localhost。 根据部署了AEM Forms的J2EE应用程序服务器,请指定以下值之一:

    • JBoss: https://<ServerName>:8080 (default port)
    • WebSphere: iiop://<ServerName>:2809 (default port)
    • WebLogic: t3://<ServerName>:7001 (default port)
  • DSC_DEFAULT_SOAP_ENDPOINT:如果您使用SOAP连接模式,此值表示调用请求所发往的端点。 要远程调用AEM Forms,请指定部署AEM Forms的J2EE应用程序服务器名称。 如果您的客户端应用程序位于同一J2EE应用程序服务器上,则可以指定localhost(例如,http://localhost:8080。)

    • 如果J2EE应用程序是JBoss,则端口值8080适用。 如果J2EE应用程序服务器是IBM® WebSphere®,请使用端口9080。 同样,如果J2EE应用程序服务器是WebLogic,请使用端口7001。 (这些值是默认端口值。 如果更改端口值,请使用适用的端口号。)
  • DSC_TRANSPORT_PROTOCOL:如果使用的是EJB连接模式,请为此值指定ServiceClientFactoryProperties.DSC_EJB_PROTOCOL。 如果您使用SOAP连接模式,请指定ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL

  • DSC_SERVER_TYPE:指定部署AEM Forms的J2EE应用程序服务器。 有效值为JBossWebSphereWebLogic

    • 如果将此连接属性设置为WebSphere,则java.naming.factory.initial值设置为com.ibm.ws.naming.util.WsnInitCtxFactory
    • 如果将此连接属性设置为WebLogic,则java.naming.factory.initial值设置为weblogic.jndi.WLInitialContextFactory
    • 同样,如果您将此连接属性设置为JBoss,则java.naming.factory.initial值将设置为org.jnp.interfaces.NamingContextFactory
    • 如果您不想使用默认值,可以将java.naming.factory.initial属性设置为符合您要求的值。
    note note
    NOTE
    您可以使用ServiceClientFactoryProperties类的静态成员,而不是使用字符串来设置DSC_SERVER_TYPE连接属性。 可以使用以下值: ServiceClientFactoryProperties.DSC_WEBSPHERE_SERVER_TYPEServiceClientFactoryProperties.DSC_WEBLOGIC_SERVER_TYPEServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE
  • DSC_CREDENTIAL_USERNAME: ​指定AEM表单用户名。 用户要成功调用AEM Forms服务,需要服务用户角色。 用户还可以具有另一个包含“服务调用”权限的角色。 否则,当他们尝试调用服务时会引发异常。 如果禁用了服务安全性,则不必指定此连接属性。

  • DSC_CREDENTIAL_PASSWORD: ​指定相应的密码值。 如果禁用了服务安全性,则不必指定此连接属性。

  • DSC_REQUEST_TIMEOUT: SOAP请求的默认请求超时限制为1200000毫秒(20分钟)。 有时,请求可能需要较长时间才能完成操作。 例如,检索大量记录的SOAP请求可能需要较长的超时限制。 您可以使用ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT增加SOAP请求的请求调用超时限制。

    注意:只有基于SOAP的调用才支持DSC_REQUEST_TIMEOUT属性。

要设置连接属性,请执行以下任务:

  1. 使用构造函数创建java.util.Properties对象。

  2. 要设置DSC_DEFAULT_EJB_ENDPOINT连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:

    • ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT枚举值
    • 一个字符串值,它指定承载AEM Forms的J2EE应用程序服务器的URL
    note note
    NOTE
    如果您使用SOAP连接模式,请指定ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT枚举值而不是ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT枚举值。
  3. 要设置DSC_TRANSPORT_PROTOCOL连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:

    • ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL枚举值
    • ServiceClientFactoryProperties.DSC_EJB_PROTOCOL枚举值
    note note
    NOTE
    如果您使用SOAP连接模式,请指定ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL枚举值,而不是ServiceClientFactoryProperties.DSC_EJB_PROTOCOL枚举值。
  4. 要设置DSC_SERVER_TYPE连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:

    • ServiceClientFactoryProperties.DSC_SERVER_TYPE枚举值

    • 一个字符串值,指定承载AEM Forms的J2EE应用程序服务器(例如,如果AEM Forms部署在JBoss上,请指定JBoss)。

      1. 要设置DSC_CREDENTIAL_USERNAME连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:
    • ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME枚举值

    • 一个字符串值,它指定调用AEM Forms所需的用户名

      1. 要设置DSC_CREDENTIAL_PASSWORD连接属性,请调用java.util.Properties对象的setProperty方法并传递以下值:
    • ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD枚举值

    • 指定相应密码值的字符串值

正在设置JBoss的EJB连接模式

以下Java代码示例设置连接属性,以调用在JBoss上部署的AEM Forms,并使用EJB连接模式。

 Properties ConnectionProps = new Properties();
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "https://<hostname>:8080");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DOCUMENT_HTTP_ENDPOINT,"https://<hostname>:8080");

正在为WebLogic设置EJB连接模式

以下Java代码示例设置连接属性,以调用在WebLogic上部署的AEM Forms,并使用EJB连接模式。

 Properties ConnectionProps = new Properties();
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "t3://localhost:7001");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "WebLogic");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");

正在设置WebSphere的EJB连接模式

以下Java代码示例设置连接属性,以调用在WebSphere上部署的AEM Forms,并使用EJB连接模式。

 Properties ConnectionProps = new Properties();
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "iiop://localhost:2809");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "WebSphere");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");

正在设置SOAP连接模式

以下Java代码示例在SOAP模式下设置连接属性,以调用在JBoss上部署的AEM Forms。

 Properties ConnectionProps = new Properties();
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://localhost:8080");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
NOTE
如果选择SOAP连接模式,请确保在客户端应用程序的类路径中包含其他JAR文件。

禁用服务安全时设置连接属性

以下Java代码示例设置调用部署在JBoss应用程序服务器上的AEM Forms以及禁用服务安全时所需的连接属性。

 Properties ConnectionProps = new Properties();
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://localhost:1099");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
NOTE
所有与“使用AEM Forms编程”关联的Java快速入门均显示EJB和SOAP连接设置。

使用自定义请求超时限制设置SOAP连接模式

 Properties ConnectionProps = new Properties();
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_SOAP_ENDPOINT, "http://localhost:8080");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL,ServiceClientFactoryProperties.DSC_SOAP_PROTOCOL);
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, "JBoss");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_USERNAME, "administrator");
 ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_CREDENTIAL_PASSWORD, "password");
ConnectionProps.setProperty(ServiceClientFactoryProperties.DSC_REQUEST_TIMEOUT, "1800000"); // Request timeout limit 30 Minutes

使用上下文对象调用AEM Forms

您可以使用com.adobe.idp.Context对象以经过身份验证的用户调用AEM Forms服务(com.adobe.idp.Context对象表示经过身份验证的用户)。 使用com.adobe.idp.Context对象时,无需设置DSC_CREDENTIAL_USERNAMEDSC_CREDENTIAL_PASSWORD属性。 在使用AuthenticationManagerServiceClient对象的authenticate方法进行用户身份验证时,您可以获取com.adobe.idp.Context对象。

authenticate方法返回包含身份验证结果的AuthResult对象。 您可以通过调用com.adobe.idp.Context对象的构造函数来创建该对象。 然后调用com.adobe.idp.Context对象的initPrincipal方法并传递AuthResult对象,如以下代码所示:

 Context myCtx = new Context();
 myCtx.initPrincipal(authResult);

您可以调用ServiceClientFactory对象的setContext方法并传递com.adobe.idp.Context对象,而不是设置DSC_CREDENTIAL_USERNAMEDSC_CREDENTIAL_PASSWORD属性。 使用AEM表单用户调用服务时,请确保他们具有调用AEM Forms服务所需的名为Services User的角色。

以下代码示例说明如何在用于创建EncryptionServiceClient对象的连接设置中使用com.adobe.idp.Context对象。

 //Authenticate a user and use the Context object within connection settings
 // Authenticate the user
 String username = "wblue";
 String password = "password";
 AuthResult authResult = authClient.authenticate(username, password.getBytes());

 //Set a Content object that represents the authenticated user
 //Use the Context object to invoke the Encryption service
 Context myCtx = new Context();
 myCtx.initPrincipal(authResult);

 //Set connection settings
 Properties connectionProps = new Properties();
 connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DEFAULT_EJB_ENDPOINT, "jnp://<server>:1099");
 connectionProps.setProperty(ServiceClientFactoryProperties.DSC_TRANSPORT_PROTOCOL, ServiceClientFactoryProperties.DSC_EJB_PROTOCOL);
 connectionProps.setProperty(ServiceClientFactoryProperties.DSC_SERVER_TYPE, ServiceClientFactoryProperties.DSC_JBOSS_SERVER_TYPE);
 connectionProps.setProperty(ServiceClientFactoryProperties.DSC_DOCUMENT_HTTP_ENDPOINT,"jnp://<server>:1099");


 //Create a ServiceClientFactory object
 ServiceClientFactory myFactory = ServiceClientFactory.createInstance(connectionProps);
 myFactory.setContext(myCtx);

 //Create an EncryptionServiceClient object
 EncryptionServiceClient encryptClient  = new EncryptionServiceClient(myFactory);
NOTE
有关验证用户的完整详细信息,请参阅验证用户

调用方案 invoking_scenarios-1

本节将讨论以下调用方案:

  • 在其自己的Java虚拟机(JVM)中运行的客户端应用程序调用独立的AEM Forms实例。
  • 在其自己的JVM中运行的客户端应用程序调用群集的AEM Forms实例。

调用独立AEM Forms实例的客户端应用程序 client-application-invoking-a-stand-alone-aem-forms-instance

下图显示了一个客户端应用程序,该应用程序在其自己的JVM中运行并调用独立的AEM Forms实例。

在此方案中,客户端应用程序在其自己的JVM中运行并调用AEM Forms服务。

NOTE
此方案是所有快速入门所基于的调用方案。

调用群集AEM Forms实例的客户端应用程序 client-application-invoking-clustered-aem-forms-instances

下图显示了一个客户端应用程序,该应用程序在其自己的JVM中运行,并在群集中调用AEM Forms实例。

此方案类似于调用独立AEM Forms实例的客户端应用程序。 但是,提供程序URL不同。 如果客户端应用程序要连接到特定的J2EE应用程序服务器,该应用程序必须将URL更改为引用特定的J2EE应用程序服务器。

不建议引用特定的J2EE应用程序服务器,因为如果应用程序服务器停止,则客户端应用程序与AEM Forms之间的连接将终止。 建议提供程序URL引用单元格级别的JNDI管理器,而不是引用特定的J2EE应用程序服务器。

使用SOAP连接模式的客户端应用程序可以使用群集的HTTP负载平衡器端口。 使用EJB连接模式的客户机应用程序可以连接到特定J2EE应用程序服务器的EJB端口。 此操作处理群集节点之间的负载平衡。

WebSphere

以下示例显示了jndi.properties文件的内容,该文件用于连接到WebSphere上部署的AEM Forms。

 java.naming.factory.initial=com.ibm.websphere.naming.
 WsnInitialContextFactory
 java.naming.provider.url=corbaloc::appserver1:9810,:appserver2:9810

WebLogic

以下示例显示用于连接到部署在 WebLogic 上的 AEM 表单的 jndi.properties 文件的内容。

 java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
 java.naming.provider.url=t3://appserver1:8001, appserver2:8001

JBoss

以下示例显示了用于连接到部署在 JBoss 上的 AEM 表单的 jndi.properties 文件的内容。

 java.naming.factory.initial= org.jnp.interfaces.NamingContextFactory
 java.naming.provider.url= jnp://appserver1:1099, appserver2:1099,
 appserver3:1099
NOTE
请咨询您的管理员,以确定J2EE应用程序服务器名称和端口号。

另请参阅

包括 AEM 表单 Java 库文件

使用 Java API 将数据传递到 AEM Forms 服务

使用 Java 客户机库调用服务

使用 Java API 将数据传递到 AEM Forms 服务 passing-data-to-aem-forms-services-using-the-java-api

AEM Forms服务操作通常使用或生成PDF文档。 调用服务时,有时需要将PDF文档(或其他文档类型,如XML数据)传递给服务。 同样,有时也必需处理从服务返回的PDF文档。 允许您将数据传递到AEM Forms服务或从中传递数据的Java类是com.adobe.idp.Document

AEM Forms服务不接受PDF文档作为其他数据类型,如java.io.InputStream对象或字节数组。 com.adobe.idp.Document对象也可用于向服务传递其他类型的数据,如XML数据。

com.adobe.idp.Document对象是可序列化的Java类型,因此可以通过RMI调用传递它。 接收端可以并置(同一主机、同一类加载器)、本地(同一主机、不同类加载器)或远程(不同主机)。 针对每种情况都优化了文档内容的传递。 例如,如果发送者和接收者位于同一台主机上,则内容将通过本地文件系统传递。 (在某些情况下,可以在内存中传递文档。)

根据com.adobe.idp.Document对象的大小,数据会在com.adobe.idp.Document对象中传送或存储在服务器的文件系统上。 com.adobe.idp.Document对象占用的任何临时存储资源会在com.adobe.idp.Document处理时自动删除。 (请参阅处置文档对象。)

有时,在将对象传递到服务之前,必须知道com.adobe.idp.Document对象的内容类型。 例如,如果某项操作需要特定内容类型(如application/pdf),则建议您确定该内容类型。 (请参阅确定文档的内容类型。)

com.adobe.idp.Document对象尝试使用提供的数据确定内容类型。 如果无法从提供的数据中检索内容类型(例如,当提供数据作为字节数组时),请设置内容类型。 要设置内容类型,请调用com.adobe.idp.Document对象的setContentType方法。 (请参阅确定文档的内容类型

如果辅助文件驻留在同一文件系统上,则创建com.adobe.idp.Document对象的速度会更快。 如果辅助文件驻留在远程文件系统上,则必须执行拷贝操作,这会影响性能。

应用程序可以同时包含com.adobe.idp.Documentorg.w3c.dom.Document数据类型。 但是,请确保您完全限定org.w3c.dom.Document数据类型。 有关将org.w3c.dom.Document对象转换为com.adobe.idp.Document对象的信息,请参阅快速入门(EJB模式):使用Java API预填充Forms的可流布局

NOTE
为防止在使用com.adobe.idp.Document对象时在WebLogic中发生内存泄漏,请以2048字节或更小的块读取文档信息。 例如,以下代码以2048字节的块读取文档信息:
        // Set up the chunk size to prevent a potential memory leak
        int buffSize = 2048;

        // Determine the total number of bytes to read
        int docLength = (int) inDoc.length();
        byte [] byteDoc = new byte[docLength];

        // Set up the reading position
        int pos = 0;

        // Loop through the document information, 2048 bytes at a time
        while (docLength > 0) {
      // Read the next chunk of information
            int toRead = Math.min(buffSize, docLength);
            int bytesRead = inDoc.read(pos, byteDoc, pos, toRead);

            // Handle the exception in case data retrieval failed
            if (bytesRead == -1) {

                inDoc.doneReading();
                inDoc.dispose();
                throw new RuntimeException("Data retrieval failed!");

            }

             // Update the reading position and number of bytes remaining
             pos += bytesRead;
             docLength -= bytesRead;

        }

        // The document information has been successfully read
        inDoc.doneReading();
        inDoc.dispose();

另请参阅

使用Java API调用AEM Forms

设置连接属性

创建文档 creating-documents

在调用需要PDF文档(或其他文档类型)作为输入值的服务操作之前创建com.adobe.idp.Document对象。 com.adobe.idp.Document类提供了构造函数,使您能够从以下内容类型创建文档:

  • 字节数组
  • 现有com.adobe.idp.Document对象
  • java.io.File对象
  • java.io.InputStream对象
  • java.net.URL对象

基于字节数组创建文档 creating-a-document-based-on-a-byte-array

以下代码示例创建基于字节数组的com.adobe.idp.Document对象。

创建基于字节数组的文档对象

 Document myPDFDocument = new Document(myByteArray);

基于另一文档创建文档 creating-a-document-based-on-another-document

以下代码示例创建了一个基于另一个com.adobe.idp.Document对象的com.adobe.idp.Document对象。

创建基于其他文档的文档对象

 //Create a Document object based on a byte array
 InputStream is = new FileInputStream("C:\\Map.pdf");
 int len = is.available();
 byte [] myByteArray = new byte[len];
 int i = 0;
 while (i < len) {
       i += is.read(myByteArray, i, len);
 }
 Document myPDFDocument = new Document(myByteArray);

 //Create another Document object
 Document anotherDocument = new Document(myPDFDocument);

基于文件创建文档 creating-a-document-based-on-a-file

以下代码示例创建了一个基于名为​ map.pdf ​的PDF文件的com.adobe.idp.Document对象。 该文件位于C硬盘的根目录下。 此构造函数尝试使用文件扩展名设置com.adobe.idp.Document对象的MIME内容类型。

接受java.io.File对象的com.adobe.idp.Document构造函数也接受布尔参数。 通过将此参数设置为truecom.adobe.idp.Document对象将删除文件。 此操作意味着在将文件传递到com.adobe.idp.Document构造函数后不必删除文件。

将此参数设置为false意味着您保留此文件的所有权。 将此参数设置为true更为有效。 原因是com.adobe.idp.Document对象可以将文件直接移动到本地托管区域,而不是复制它(速度较慢)。

创建基于PDF文件的Document对象

 //Create a Document object based on the map.pdf source file
 File mySourceMap = new File("C:\\map.pdf");
 Document myPDFDocument = new Document(mySourceMap,true);

基于InputStream对象创建文档 creating-a-document-based-on-an-inputstream-object

以下Java代码示例创建基于java.io.InputStream对象的com.adobe.idp.Document对象。

基于InputStream对象创建文档

 //Create a Document object based on an InputStream object
 InputStream is = new FileInputStream("C:\\Map.pdf");
 Document myPDFDocument = new Document(is);

根据可从URL访问的内容创建文档 creating-a-document-based-on-content-accessible-from-an-url

以下Java代码示例创建了一个基于名为​ map.pdf ​的PDF文件的com.adobe.idp.Document对象。 此文件位于在localhost上运行的名为WebApp的Web应用程序中。 此构造函数尝试使用随URL协议返回的内容类型来设置com.adobe.idp.Document对象的MIME内容类型。

提供给com.adobe.idp.Document对象的URL始终在创建原始com.adobe.idp.Document对象的一侧读取,如以下示例所示:

     Document doc = new Document(new java.net.URL("file:c:/temp/input.pdf"));

c:/temp/input.pdf 文件必须位于客户端计算机上(而不是服务器计算机上)。 客户端计算机是读取 URL 和创建对象的位置 com.adobe.idp.Document

根据可通过 URL 访问的内容创建文档

 //Create a Document object based on a java.net.URL object
 URL myURL = new URL("http", "localhost", 8080,"/WebApp/map.pdf");

 //Create another Document object
 Document myPDFDocument = new Document(myURL);

另请参阅

使用Java API调用AEM Forms

设置连接属性

处理返回的文档 handling-returned-documents

将 PDF 文档(或其他数据类型,如 XML 数据)作为输出值的服务操作将返回一个 com.adobe.idp.Document 对象。 收到 com.adobe.idp.Document 对象后,可以将其转换为以下格式:

  • 一个 java.io.File 对象
  • 一个 java.io.InputStream 对象
  • 字节数组

以下代码行将com.adobe.idp.Document对象转换为java.io.InputStream对象。 假设myPDFDocument代表com.adobe.idp.Document对象:

     java.io.InputStream resultStream = myDocument.getInputStream();

同样,您可以通过执行以下任务将com.adobe.idp.Document的内容复制到本地文件:

  1. 创建java.io.File对象。
  2. 调用com.adobe.idp.Document对象的copyToFile方法并传递java.io.File对象。

以下代码示例将com.adobe.idp.Document对象的内容复制到名为​ AnotherMap.pdf ​的文件。

将文档对象的内容复制到文件

 File outFile = new File("C:\\AnotherMap.pdf");
 myDocument.copyToFile (outFile);

另请参阅

使用Java API调用AEM Forms

设置连接属性

确定文档的内容类型 determining-the-content-type-of-a-document

通过调用com.adobe.idp.Document对象的getContentType方法确定com.adobe.idp.Document对象的MIME类型。 此方法返回指定com.adobe.idp.Document对象的内容类型的字符串值。 下表介绍了AEM Forms返回的各种内容类型。

MIME类型
描述
application/pdf
PDF文档
application/vnd.adobe.xdp+xml
XML数据打包(XDP) ,用于导出的XML Forms架构(XFA)表单
text/xml
书签、附件或其他XML文档
application/vnd.fdf
Forms数据格式(FDF),用于导出的Acrobat表单
application/vnd.adobe.xfdf
XML Forms数据格式(XFDF),用于导出的Acrobat表单
application/rdf+xml
丰富的数据格式和XML
application/octet-stream
通用数据格式
NULL
未指定的MIME类型

以下代码示例确定com.adobe.idp.Document对象的内容类型。

正在确定Document对象的内容类型

 //Determine the content type of the Document object
 String ct = myDocument.getContentType();
 System.out.println("The content type of the Document object is " +ct);

另请参阅

使用Java API调用AEM Forms

设置连接属性

处置文档对象 disposing-document-objects

当您不再需要Document对象时,建议通过调用其dispose方法将其处置。 每个Document对象在应用程序的主机平台上占用一个文件描述符和多达75 MB的RAM空间。 如果未释放Document对象,则Java车库收集进程会将其释放。 但是,通过使用dispose方法更快地处理它,您可以释放Document对象占用的内存。

另请参阅

使用Java API调用AEM Forms

包括AEM Forms Java库文件

使用Java客户端库调用服务

使用Java客户端库调用服务 invoking-a-service-using-a-java-client-library

AEM Forms服务操作可以通过使用服务的强类型API(称为Java客户端库)调用。 Java客户端库 ​是一组具体类,它们提供对服务容器中部署的服务进行访问的权限。 您实例化表示要调用的服务的Java对象,而不是使用调用API创建InvocationRequest对象。 调用API用于调用进程,例如在Workbench中创建的长期进程。 (请参阅调用以人为中心的长期进程。)

要执行服务操作,请调用属于Java对象的方法。 Java客户端库包含的方法通常使用服务操作进行一对一映射。 使用Java客户端库时,设置所需的连接属性。 (请参阅设置连接属性。)

设置连接属性后,创建一个ServiceClientFactory对象,该对象用于实例化允许您调用服务的Java对象。 每个具有Java客户端库的服务都有一个相应的客户端对象。 例如,要调用存储库服务,请使用它的构造函数创建一个ResourceRepositoryClient对象,然后传递ServiceClientFactory对象。 ServiceClientFactory对象负责维护调用AEM Forms服务所需的连接设置。

尽管获取ServiceClientFactory通常很快,但在首次使用工厂时会产生一些额外开销。 此对象已针对重用进行了优化,因此,在可能的情况下,在创建多个Java客户端对象时使用相同的ServiceClientFactory对象。 即,不要为您创建的每个客户端库对象创建单独的ServiceClientFactory对象。

有一个用户管理器设置可控制影响ServiceClientFactory对象的com.adobe.idp.Context对象内的SAML断言的生命周期。 此设置控制整个AEM Forms中的所有身份验证上下文生命周期,包括使用Java API执行的所有调用。 默认情况下,可以使用ServiceCleintFactory对象的时间段为两个小时。

NOTE
为了说明如何使用Java API调用服务,将调用存储库服务的writeResource操作。 此操作会将新资源放入存储库中。

通过使用 Java 客户机库并执行以下步骤,可以调用存储库服务:

  1. 在 Java 项目的类路径中包含客户机 JAR 文件,如adobe-repository-client.jar。 有关这些文件的位置的信息,请参阅 包括AEM Forms Java库文件

  2. 设置调用服务所需的连接属性。

  3. 通过调用ServiceClientFactory对象的静态createInstance方法并传递包含连接属性的java.util.Properties对象来创建ServiceClientFactory对象。

  4. 使用对象的构造函数创建ResourceRepositoryClient对象并传递ServiceClientFactory对象。 ResourceRepositoryClient使用该对象调用存储库服务操作。

  5. RepositoryInfomodelFactoryBean使用对象的构造函数创建对象并传递 null.此对象允许您创建一个 Resource 对象,该对象表示添加到存储库的内容。

  6. Resource通过调用RepositoryInfomodelFactoryBean对象的方法newImage并传递以下值来创建对象:

    • 通过指定 new Id()的唯一 ID 值。
    • 通过指定new Lid()获得唯一的UUID值。
    • 资源的名称。 您可以指定XDP文件的文件名。

    将返回值强制转换为Resource

  7. 通过调用RepositoryInfomodelFactoryBean对象的newImage方法并将返回值强制转换为ResourceContent来创建ResourceContent对象。 此对象表示添加到存储库的内容。

  8. 通过传递存储要添加到存储库的XDP文件的java.io.FileInputStream对象来创建com.adobe.idp.Document对象。 (请参阅基于InputStream对象创建文档。)

  9. 通过调用ResourceContent对象的setDataDocument方法,将com.adobe.idp.Document对象的内容添加到ResourceContent对象。 传递com.adobe.idp.Document对象。

  10. 通过调用ResourceContent对象的setMimeType方法并传递application/vnd.adobe.xdp+xml,设置要添加到存储库的XDP文件的MIME类型。

  11. 通过调用Resource对象的setContent方法并传递ResourceContent对象,将ResourceContent对象的内容添加到Resource对象。

  12. 通过调用Resource对象的setDescription方法并传递表示资源说明的字符串值来添加资源的说明。

  13. 通过调用ResourceRepositoryClient对象的writeResource方法并传递以下值,将表单设计添加到存储库:

    • 一个字符串值,它指定包含新资源的资源集合的路径
    • 已创建的Resource对象

另请参阅

快速入门(EJB模式):使用Java API编写资源

使用Java API调用AEM Forms

包括AEM Forms Java库文件

使用调用API调用短期进程 invoking-a-short-lived-process-using-the-invocation-api

您可以使用Java调用API调用短期进程。 使用调用API调用短期进程时,使用java.util.HashMap对象传递所需的参数值。 对于要传递给服务的每个参数,调用java.util.HashMap对象的put方法,并指定服务执行指定操作所需的名称 — 值对。 指定属于短期进程的参数的确切名称。

NOTE
有关调用长期进程的信息,请参阅调用以人为中心的长期进程

此处的讨论是关于使用调用API来调用以下名为MyApplication/EncryptDocument的AEM Forms短期进程。

NOTE
此流程并非基于现有的AEM Forms流程。 要遵循代码示例,请使用Workbench创建名为MyApplication/EncryptDocument的进程。 (请参阅使用Workbench。)

调用此进程时,将执行以下操作:

  1. 获取传递到进程的不安全PDF文档。 此操作基于SetValue操作。 此进程的输入参数是名为inDocdocument进程变量。
  2. 使用密码加密PDF文档。 此操作基于PasswordEncryptPDF操作。 密码加密的PDF文档在名为outDoc的进程变量中返回。

使用Java调用API调用MyApplication/EncryptDocument短暂进程 invoke-the-myapplication-encryptdocument-short-lived-process-using-the-java-invocation-api

使用Java调用API调用MyApplication/EncryptDocument短期进程:

  1. 将客户端JAR文件(如adobe-livecycle-client.jar)包含在Java项目的类路径中。 (请参阅包括AEM Forms Java库文件。)

  2. 创建包含连接属性的ServiceClientFactory对象。 (请参阅设置连接属性。)

  3. 使用对象的构造函数创建ServiceClient对象并传递ServiceClientFactory对象。 ServiceClient对象允许您调用服务操作。 它处理诸如定位、分派和路由调用请求等任务。

  4. 使用构造函数创建java.util.HashMap对象。

  5. 对每个要传递给长期进程的输入参数调用java.util.HashMap对象的put方法。 由于MyApplication/EncryptDocument短暂的进程需要一个类型为Document的输入参数,因此您只需调用一次put方法,如以下示例所示。

    code language-java
     //Create a Map object to store the parameter value for inDoc
     Map params = new HashMap();
     InputStream inFile = new FileInputStream("C:\\Adobe\Loan.pdf");
     Document inDoc = new Document(inFile);
     params.put("inDoc", inDoc);
    
  6. 通过调用ServiceClientFactory对象的createInvocationRequest方法并传递以下值来创建InvocationRequest对象:

    • 一个字符串值,它指定要调用的长生命周期进程的名称。 要调用MyApplication/EncryptDocument进程,请指定MyApplication/EncryptDocument
    • 表示流程操作名称的字符串值。 通常,短期进程操作的名称为invoke
    • 包含服务操作所需的参数值的java.util.HashMap对象。
    • 一个布尔值,指定true,用于创建同步请求(此值适用于调用短期进程)。
  7. 通过调用ServiceClient对象的invoke方法并传递InvocationRequest对象,将调用请求发送到该服务。 invoke方法返回InvocationReponse对象。

    note note
    NOTE
    通过传递值false作为createInvocationRequest方法的第四个参数,可以调用长时间的进程。 传递值​false将创建异步请求。
  8. 通过调用InvocationReponse对象的getOutputParameter方法并传递指定输出参数名称的字符串值来检索进程的返回值。 在这种情况下,请指定outDocoutDocMyApplication/EncryptDocument进程的输出参数的名称)。 将返回值强制转换为Document,如以下示例所示。

    code language-java
     InvocationResponse response = myServiceClient.invoke(request);
     Document encryptDoc = (Document) response.getOutputParameter("outDoc");
    
  9. 创建java.io.File对象并确保文件扩展名为.pdf。

  10. 调用com.adobe.idp.Document对象的copyToFile方法以将com.adobe.idp.Document对象的内容复制到文件中。 确保使用getOutputParameter方法返回的com.adobe.idp.Document对象。

另请参阅

快速入门:使用调用API调用短期进程

调用以人为中心的长期进程

包括AEM Forms Java库文件

recommendation-more-help
19ffd973-7af2-44d0-84b5-d547b0dffee2