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
相关产品推荐
相关产品推荐

