`
819342090
  • 浏览: 5498 次
文章分类
社区版块
存档分类
最新评论

mule的Servlet组件将request body放到message的payload中

阅读更多

mule源代码

/*
 * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
 * The software in this package is published under the terms of the CPAL v1.0
 * license, a copy of which has been included with this distribution in the
 * LICENSE.txt file.
 */
package org.mule.transport.servlet;

import org.mule.DefaultMuleMessage;
import org.mule.api.MuleContext;
import org.mule.api.MuleMessage;
import org.mule.transport.AbstractMuleMessageFactory;
import org.mule.transport.http.HttpConstants;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.collections.EnumerationUtils;

public class ServletMuleMessageFactory extends AbstractMuleMessageFactory
{
    ……

    protected Object extractPayloadFromPostRequest(HttpServletRequest request) throws Exception
    {
        /*
         * Servlet Spec v2.5:
         *
         * SRV.3.1.1
         * When Parameters Are Available
         *
         * The following are the conditions that must be met before post form data will
         * be populated to the parameter set:
         *
         * 1. The request is an HTTP or HTTPS request.
         * 2. The HTTP method is POST.
         * 3. The content type is application/x-www-form-urlencoded.
         * 4. The servlet has made an initial call of any of the getParameter family of meth-
         *    ods on the request object.
         *
         * If the conditions are not met and the post form data is not included in the
         * parameter set, the post data must still be available to the servlet via the request
         * object's input stream. If the conditions are met, post form data will no longer be
         * available for reading directly from the request object's input stream.
         *
         * -----------------------------------------------------------------------------------
         *
         * In plain english:if you call getInputStream on a POSTed request before you call one of
         * the getParameter* methods, you'll lose the parameters. So we touch the parameters first
         * and only then we return the input stream that will be the payload of the message.
         */
        request.getParameterNames();

        return request.getInputStream();
    }
    ……
}

 

 “request.getParameterNames();”这一句代码已经对InpuStream进行了读取,当执行“return request.getInputStream();”时,已经无法从InpuStream中获取到request body了,所以要把 “request.getParameterNames();”这一句代码删除。

重写该factory,然后让Servlet组件调用connector,该connector使用新的factory,如下:

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

 

Ref:

http://download.oracle.com/otn-pub/jcp/servlet-2.5-mr5-oth-JSpec/servlet-2.5-mr5-spec.pdf?AuthParam=1480926368_0fcec9d71c58792a07c45e3f8f129d65#search=%27servlet+2.5+spec%27

SRV.3.1.1

分享到:
评论

相关推荐

    mule ajax组件依赖jar

    mule esb中使用ajax组件所需要依赖jar 包。

    Mule ESB开发一个小例子

    Logger的Message栏中输入"Current payload is #[message.payload]",以便记录原始消息负载。Set Payload Transformer的Value栏则输入"#['Hello, ' + message.payload + '. Today is '+ server.dateTime.format('dd/...

    Mule ESB Studio 3.3中文使用手册(官方翻译)

    例如,用户可以运行 Flight Reservation 例子,通过拷贝示例项目到 $MULE_HOME/apps 目录下,并启动 Mule。 启动 Mule Studio ---------------- 如果用户已经安装了 Mule ESB Studio,可以启动 Mule Studio 并创建...

    mule文档详解 mule

    - **服务**: 在Mule中,服务是执行特定业务逻辑的可重用组件,可以通过HTTP、JMS、FTP等协议暴露或消费。 - **传输**: 传输是Mule用来与外部系统交互的接口,如HTTP、JDBC、FTP等。 - **数据流**: 数据流定义了数据...

    MULE ESB-4.1社区办运行环境

    在描述中提到,只需将AnyPoint Studio开发的项目放到`APPS`目录下,Mule服务器会自动识别并加载这些应用程序。 在实际应用中,用户可以通过以下步骤部署Mule应用程序: 1. 使用AnyPoint Studio开发并测试应用程序。...

    Mule ESB手册-中文版

    介绍了如何将现有项目导入到Mule Studio,以及如何将Mule项目导出到MuleiON云平台或导出为发布文件。 13. Mule Studio 示例 这部分通过具体例子介绍了如何利用Mule Studio创建项目,包括基于模板创建项目和理解预建...

    简单的tomcat中集成mule

    - 在项目的`src`目录下创建`mule-config.xml`,将Mule Studio中开发的XML配置内容粘贴到这里。 - 你可能还需要把与这个配置相关的Java类复制到`classes`目录下,以便在Tomcat环境中能够找到这些类。 4. **复制...

    Mule ESB 开发例子

    本部分将详细介绍如何在 Mule Studio 中创建一个新的项目,并构建一个简单的 Mule 流。 ##### 1. 创建新项目 1. **打开 Mule Studio**,点击 `File &gt; New &gt; Mule Project`。 2. **填写项目信息**: - 项目名称:`...

    mule -esb 源码

    综上所述,Mule ESB的源码包含了丰富的组件和配置,从日志记录到企业级服务,再到安全性和网络代理,涵盖了构建一个强大集成平台所需的各种要素。理解并熟练掌握这些配置文件的用法,对于开发和维护高效、可靠的Mule...

    MuleESB3.0中文教程

    - **UMO (Universal Message Objects)**:这是Mule 2.0及以前版本中的概念,现已由Component Composition取代。UMO用于实现整合逻辑,可以是POJO或JavaBean等形式。 - **组件Composition**:用于组织和编排业务逻辑...

    mule开发环境搭建和部署

    在环境变量中新建一个名为MULE_HOME的变量,值为Mule的路径,然后将其添加到Path路径中。至此,Mule的安装配置完成。 二、Mule服务启动 在启动Mule服务之前,需要先配置环境变量。在命令行中输入mule命令,出现...

    MuleESB_3.0_中文教程

    1. **安装与配置**:教程将引导你完成Mule ESB 3.0的安装,以及如何在Mule Studio中创建新项目。 2. **创建第一个Mule应用**:从简单的HTTP监听器和响应者开始,了解如何定义流和组件。 3. **连接器使用**:学习...

    mule in action 说明+文档介绍

    Mule的核心组件是UMO(Universal Message Objects,从Mule2.0开始UMO这一概念已经被组件Componse所代替),UMO实现整合逻辑。UMO可以是POJO,JavaBean等等。它支持30多种传输协议(file,FTP,UDP,TCP,email,HTTP,SOAP,JMS...

    MULE ESB-4.1企业版运行环境

    5. **部署流程**:将开发的Mule应用解压并放入“apps”目录后,MULE ESB会在启动时自动检测并加载这些应用。通过管理控制台或者命令行工具,可以对应用进行启动、停止、重启等操作。 6. **企业特性**:MULE ESB企业...

    mule 下的json格式输出

    在Mule流程中,可以使用`&lt;dw:transform-message&gt;`元素将输入数据转换为JSON: ```xml &lt;mule xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw"&gt; ...

    MULE用户指南3.3

    2. **MULE配置与部署**:用户指南将详细介绍如何配置MULE实例,包括设置环境变量、安装和启动MULE服务器,以及部署MULE应用到不同的运行时环境,如MULE Standalone或CloudHub。 3. **连接器(Connectors)**:MULE ...

    Mule 实现路由分发

    "Mule实现路由分发"这一主题涉及到Mule如何处理消息的传递和定向,这在分布式系统和微服务架构中是至关重要的。 路由分发是Mule的核心功能之一,它确保消息被正确地发送到目标系统或服务。通过Java代码实现路由分发...

Global site tag (gtag.js) - Google Analytics