You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将WSO2 APIM的Payload传递至Java Mediate函数并返回结果

解决方案:WSO2 APIM Payload传递至Java Mediator并返回加解密结果

1. 修复Java Mediator的Payload读取与返回逻辑

在AESEncryptMediator.java中,必须从MessageContext正确读取当前请求/响应的Payload,处理完成后再将结果写回上下文。以下是修正后的核心代码:

import org.apache.synapse.MessageContext;
import org.apache.synapse.mediators.AbstractMediator;
import org.apache.synapse.util.MessageHelper;
import org.apache.axiom.om.OMElement;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

public class AESEncryptMediator extends AbstractMediator {

    public boolean mediate(MessageContext context) {
        try {
            // 读取当前消息Payload
            InputStream payloadStream = MessageHelper.getInputStream(context.getEnvelope());
            ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int readBytes;
            while ((readBytes = payloadStream.read(buffer)) != -1) {
                byteStream.write(buffer, 0, readBytes);
            }
            String rawPayload = byteStream.toString("UTF-8");
            
            // 执行AES加密逻辑(替换为你的实际加密实现)
            String encryptedPayload = processAES(rawPayload);
            
            // 将加密结果写回MessageContext
            OMElement newBodyElement = org.apache.axiom.om.OMAbstractFactory.getOMFactory()
                .createOMElement("encryptedResponse", null);
            newBodyElement.setText(encryptedPayload);
            
            // 替换原有Body内容
            if (context.getEnvelope().getBody().hasChildNodes()) {
                context.getEnvelope().getBody().getFirstElement().detach();
            }
            context.getEnvelope().getBody().addChild(newBodyElement);
            
        } catch (Exception e) {
            handleException("Payload加密失败", e, context);
            return false;
        }
        return true;
    }

    // 自定义AES加解密实现(示例)
    private String processAES(String input) throws Exception {
        // 此处替换为你的AES加密/解密逻辑,注意密钥管理需合规
        return "aes_encrypted_" + input;
    }
}

关键注意点:

  • 用MessageHelper.getInputStream读取完整的Envelope内容,避免硬编码或局部读取
  • 处理完成后必须替换原有Body节点,否则APIM无法获取新的Payload

2. 调整OutSequence策略配置

确保你的OutSeq.xml中Class Mediator配置正确,且在响应流程的合适位置执行:

<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="OutSeq">
    <!-- 可选:打印原始Payload用于调试 -->
    <log level="full" category="DEBUG">
        <property name="STEP" value="原始Payload"/>
    </log>
    
    <!-- 调用自定义Java Mediator -->
    <class name="com.your.package.AESEncryptMediator"/>
    
    <!-- 可选:打印处理后的Payload验证结果 -->
    <log level="full" category="DEBUG">
        <property name="STEP" value="加密后Payload"/>
    </log>
    
    <!-- 发送处理后的响应 -->
    <send/>
</sequence>

配置要点:

  • class属性必须完全匹配你的Java类全限定名
  • 若需传递密钥等参数,可通过<property name="AES_KEY" value="your_key"/>设置,再在Java类中用context.getProperty("AES_KEY")获取

3. 常见问题排查

  • ClassNotFound异常:将编译好的jar包放入<APIM_HOME>/repository/components/lib,重启APIM服务
  • Payload为空:检查API是否正确关联了该OutSequence,确保响应流触发了序列执行
  • XML解析错误:加密后的内容若包含特殊字符,需做Base64编码后再写入Body
  • 逻辑调试:在Java类中添加log.info("待处理Payload: " + rawPayload);输出中间结果,定位问题

内容的提问来源于stack exchange,提问作者rishi puri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:20:22