欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mule传附件attachment muleattachment附件 

程序员文章站 2022-06-17 13:28:21
...

HTTP Endpoint

重写mule源代码中的HttpMultipartMuleMessageFactory.java

 

package com.rakuten.api.cabinet.factory;

import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import javax.activation.DataHandler;
import org.mule.DefaultMuleMessage;
import org.mule.api.MuleContext;
import org.mule.transport.http.HttpMuleMessageFactory;
import org.mule.transport.http.HttpRequest;
import org.mule.transport.http.multipart.MultiPartInputStream;
import org.mule.transport.http.multipart.Part;
import org.mule.transport.http.multipart.PartDataSource;

import com.rakuten.api.cabinet.constants.CabinetFlowConstants;

/**
 *
 * Corretion Alexis ANASTASSIADES ___  alexis - at - ezanas.com
 * @author ldns_zhuling
 */
public class HttpMultipartMuleMessageFactory extends HttpMuleMessageFactory {
    /** parts */
    private Collection<Part> parts;
    /**
     *
     * @param context context
     */
    public HttpMultipartMuleMessageFactory(MuleContext context) {
        super(context);
    }

    @Override
    protected Object extractPayloadFromHttpRequest(HttpRequest httpRequest) throws IOException
    {
        Object body = null;
        String contentType = httpRequest.getContentType();
        if (contentType.toLowerCase().contains("multipart/form-data")) {
            // modify multipart/form-data to lower case
            // 可能出现大小写的contentType,需要全部转为小写的
            contentType = contentType.replace(contentType.substring(0,
                    CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART.length()),
                    CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART);
            MultiPartInputStream in = new MultiPartInputStream(httpRequest.getBody(),
                    contentType, null);

            // We need to store this so that the headers for the part can be read
            parts = in.getParts();
            for (Part part : parts) {
                //将名为xml的附件内容放到message.payload中,这个根据项目传进来的附件名进行修改
                if ("xml".equals(part.getName())) {
                    body = part.getInputStream();
                    break;
                }
            }
        } else {
            body = super.extractPayloadFromHttpRequest(httpRequest);
        }

        return body;
    }

    @Override
    protected void addAttachments(DefaultMuleMessage message, Object transportMessage) throws Exception {
        if (parts != null) {
            try {
                for (Part part : parts) {
                    //将除了名为payload的其他所有的附件放到header中
                    //建议在附件使用完后,将附件删除,否则返回会出现错误
                    if (!"payload".equals(part.getName())) {
                        message.setInboundProperty(part.getName(), new DataHandler(new PartDataSource(part)));
                    }
                }
            } finally {
                // Attachments are the last thing to get processed
                parts.clear();
                parts = null;
            }
        }
    }

    @Override
    protected void convertMultiPartHeaders(Map<String, Object> headers) {
    }

}

 Servlet Endpoint

需要重写ServletMuleMessageFactory.java

package com.rakuten.api.cabinet.factory;

import java.util.Collection;
import javax.activation.DataHandler;
import javax.servlet.http.HttpServletRequest;

import org.mule.DefaultMuleMessage;
import org.mule.api.MuleContext;
import org.mule.transport.http.multipart.MultiPartInputStream;
import org.mule.transport.http.multipart.Part;
import org.mule.transport.http.multipart.PartDataSource;
import org.mule.transport.servlet.ServletMuleMessageFactory;

import com.rakuten.api.cabinet.constants.CabinetFlowConstants;

/**
 *
 * Corretion Alexis ANASTASSIADES ___  alexis - at - ezanas.com
 * @author ldns_zhuling
 */
public class ServletMultipartMuleMessageFactory extends ServletMuleMessageFactory {
    /** parts */
    private Collection<Part> parts;
    /**
     *
     * @param context context
     */
    public ServletMultipartMuleMessageFactory(MuleContext context) {
        super(context);
    }

    @Override
    protected Object extractPayloadFromPostRequest(HttpServletRequest request) throws Exception
    {
        Object body = null;
        String contentType = request.getContentType();
        if (contentType.toLowerCase().contains(CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART)) {
            // modify multipart/form-data to lower case
            contentType = contentType.replace(contentType.substring(0,
                    CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART.length()),
                    CabinetFlowConstants.CONTENT_TYPE_MULTIPART_PART);
            MultiPartInputStream in = new MultiPartInputStream(request.getInputStream(),
                    contentType, null);

            // We need to store this so that the headers for the part can be read
            parts = in.getParts();
            for (Part part : parts) {
                if ("xml".equals(part.getName())) {
                    body = part.getInputStream();
                    break;
                }
            }
        } else {
            //原代码中在获取body之前加了这句“request.getParameterNames();”
            //这句必须删掉,否则获取不到body,因为InputStream不能重复读取。
            body = request.getInputStream();
        }

        return body;
    }

    @Override
    protected void addAttachments(DefaultMuleMessage message, Object transportMessage) throws Exception {
        if (parts != null) {
            try {
                for (Part part : parts) {
                    if (!"payload".equals(part.getName())) {
                        message.setInboundProperty(part.getName(), new DataHandler(new PartDataSource(part)));
                    }
                }
            } finally {
                // Attachments are the last thing to get processed
                parts.clear();
                parts = null;
            }
        }
    }
}

 

然后需要在connector中调用该factory

    <http:connector name="defaultconnector" cookieSpec="netscape"
        doc:name="HTTP\HTTPS" receiveBacklog="0" receiveBufferSize="0"
        sendBufferSize="0" socketSoLinger="0" validateConnections="true">
        <dispatcher-threading-profile
            maxBufferSize="0" maxThreadsActive="${maximum.concurrency}"
            maxThreadsIdle="${maximum.concurrency}" poolExhaustedAction="WAIT"
            threadWaitTimeout="${inner.response.timeout}" />
        <service-overrides sessionHandler="org.mule.session.NullSessionHandler" messageFactory="com.rakuten.api.cabinet.factory.HttpMultipartMuleMessageFactory"/>
    </http:connector>

 

    <servlet:connector name="Servlet" doc:name="Servlet">
        <service-overrides messageFactory="com.rakuten.api.coupon.factory.ServletMuleMessageFactory"/>
    </servlet:connector>