#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 в ответ вы найдете файл вложения