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

Spring Boot开发SOAP请求自定义Header信息获取失败排查

问题分析与解决方案

1. 核心问题:命名空间不匹配

你的SOAP请求中,RequestHeader节点的命名空间是 http://com/schema/RequestHeader,但代码里@SoapHeader注解指定的命名空间是 {http://com/schema/RequestHeader/2/0}RequestHeader——多了/2/0后缀。这会导致Spring无法正确匹配到Header节点,虽然不会抛出异常,但后续解析时拿到的节点内容不符合JAXB映射要求,最终导致属性值为空。

2. JAXB实体类映射需校验

检查你的RequestHeader实体类的JAXB注解是否正确:

  • 类上的@XmlRootElement的namespace必须和请求中的命名空间完全一致;
  • name字段的@XmlElement也要指定对应命名空间(如果请求中该字段属于同一命名空间)。示例如下:
@XmlRootElement(namespace = "http://com/schema/RequestHeader")
public class RequestHeader {
    @XmlElement(namespace = "http://com/schema/RequestHeader")
    private String name;

    // 标准getter/setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

3. 代码小细节修正

日志输出代码里的requestH.getName是语法错误,应该调用requestH.getName()方法来获取属性值。

修正后的关键代码片段

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "OrderRequest")
@ResponsePayload
public JAXBElement<OrderResponse> createOrder(@RequestPayload JAXBElement<OrderRequest> createWorkOrderRequestCplxType, 
        @SoapHeader("{http://com/schema/RequestHeader}RequestHeader") SoapHeaderElement requestHeader) {

    log.info("Start createWorkOrder :");

    try{
        Source bodySource = requestHeader.getSource();
        DOMSource bodyDomSource = (DOMSource) bodySource;
        JAXBContext context = JAXBContext.newInstance(RequestHeader.class);
        Unmarshaller unmarshaller = context.createUnmarshaller();
        RequestHeader requestH = (RequestHeader) unmarshaller.unmarshal(bodyDomSource);
        log.info("activity name from request header : {}", requestH.getName());
    }catch (JAXBException e){
        e.printStackTrace();
    }
    // 其他业务逻辑...
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:28:24