запрос веб-служб прокси-сервера mule esb с вложением

#web-services #xslt #cxf #mule #alfresco

#веб-службы #xslt #cxf #mule #на открытом воздухе

Вопрос:

Я хочу сделать следующее:

Использовать веб-запрос с вложениями

преобразуйте запрос там, где требуется установить поток содержимого из запроса, запрос на преобразование выглядит следующим образом:

  <ns:contentStream>
        <!--Optional:-->
        <ns:length>?</ns:length>
        <!--Optional:-->
        <ns:mimeType>?</ns:mimeType>
        <!--Optional:-->
        <ns:filename>?</ns:filename>
        <ns:stream>cid:96497346318</ns:stream>
        <!--You may enter ANY elements at this point-->
   </ns:contentStream>
  

а затем отправьте запрос в alfresco для создания документа.

мой поток выглядит примерно так:

     <flow name="SOAP2SOAPFlow2" doc:name="SOAP-2-SOAP proxy using CXF">
    <http:inbound-endpoint exchange-pattern="request-response" 
        host="localhost" port="8081" path="cc" doc:name="HTTP"/>
    <cxf:proxy-service namespace="urn:greeter:GreeterResponder:1" 
        service="GreeterResponderService" payload="body" 
        wsdlLocation="schemas/interactions/GreeterInteraction/GreeterInteraction_1.0.wsdl" 
        enableMuleSoapHeaders="false" doc:name="SOAP"/>        
<mulexml:xslt-transformer 
        maxIdleTransformers="2" maxActiveTransformers="5" 
        outputEncoding="UTF-8" doc:name="Transform from outer to inner" 
        xsl-file="transform-outer2inner.xslt" encoding="UTF-8" 
        returnClass="java.lang.String"/>
<cxf:proxy-client payload="body" enableMuleSoapHeaders="true"/ >
    <http:outbound-endpoint exchange-pattern="request-response" 
        address="http://localhost:8080/alfresco/cmisws/ObjectService" doc:name="HTTP" />
</flow>
  

итак, как мне добавить вложения в полезную нагрузку при отправке запроса на createDocument в Alfresco?

Заранее спасибо!

Ответ №1:

Вы можете добавить вложение с помощью класса Java … Вам необходимо добавить добавить пользовательский процессор перед прокси-сервисом CXF и вызовом класса Java. И следующий шаг — добавить cxf:outInterceptors в CXF roxy-service, конфигурация Mule следующая :-

 <flow name="SOAP2SOAPFlow2" doc:name="SOAP-2-SOAP proxy using CXF">
    <http:inbound-endpoint exchange-pattern="request-response" 
        host="localhost" port="8081" path="cc" doc:name="HTTP"/>
   <custom-processor class="com.test.services.schema.SOAPOptionalData.AddAttachmentMessageProcessor" doc:name="Custom Processor"/>       

 <cxf:proxy-service namespace="urn:greeter:GreeterResponder:1" 
        service="GreeterResponderService" payload="body" 
        wsdlLocation="schemas/interactions/GreeterInteraction/GreeterInteraction_1.0.wsdl" 
        enableMuleSoapHeaders="false" doc:name="SOAP">   


 <cxf:outInterceptors>
<spring:bean id ="copyAttachment" class="org.mule.module.cxf.support.CopyAttachmentOutInterceptor"/> <!-- SOAP Attachment -->

 </cxf:outInterceptors>
 </cxf:proxy-service>


<mulexml:xslt-transformer 
        maxIdleTransformers="2" maxActiveTransformers="5" 
        outputEncoding="UTF-8" doc:name="Transform from outer to inner" 
        xsl-file="transform-outer2inner.xslt" encoding="UTF-8" 
        returnClass="java.lang.String"/>
<cxf:proxy-client payload="body" enableMuleSoapHeaders="true"/ >
    <http:outbound-endpoint exchange-pattern="request-response" 
        address="http://localhost:8080/alfresco/cmisws/ObjectService" doc:name="HTTP" />
</flow>
  

и класс Java выглядит следующим образом, он принимает путь к вложению из файла свойств :-

 package com.test.services.schema.SOAPOptionalData;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;

import javax.activation.DataSource;

    import org.apache.axiom.attachments.ConfigurableDataHandler;
    import org.apache.cxf.attachment.*;
    import org.apache.cxf.message.Attachment;
    import org.mule.api.MuleEvent;
    import org.mule.api.MuleException;
    import org.mule.api.processor.MessageProcessor;
    import org.mule.module.cxf.CxfConstants;
    import org.mule.util.IOUtils;

    import com.sun.istack.ByteArrayDataSource;
    import com.test.services.schema.maindata.v1.Impl.MainDataImpl;

    public class AddAttachmentMessageProcessor implements MessageProcessor
    {

        Properties prop = new Properties(); //Creating property file object read File attachment path from property file
        InputStream input = null; // To read property file path

        @Override
        public MuleEvent process(MuleEvent event) throws MuleException
        {




            Collection<Attachment> attachments = new ArrayList<Attachment>();

            AttachmentImpl attachment = new AttachmentImpl("1");
            String attachmentXML = "";

            try
            {

              input = getClass().getResourceAsStream("/conf/DBConnectionProp.properties"); // Property file path in classpath
              prop.load(input); // get and load the property file

                attachmentXML = IOUtils.getResourceAsString(prop.getProperty("Attachment_File"), this.getClass());
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }

            DataSource source = new ByteArrayDataSource(attachmentXML.getBytes(), "text/xml");

            attachment.setDataHandler(new ConfigurableDataHandler(source));

            attachments.add(attachment);


            event.getMessage().setInvocationProperty(CxfConstants.ATTACHMENTS, attachments);
            return event;
        }


    }
  

Примечание: — просто не забудьте изменить свой ответ XSLT в соответствии с ним… При тестировании в пользовательском интерфейсе SOAP в ответ вы найдете файл вложения