我已经使用Spring Boot开发了SOAP请求,其中我的SOAP请求在"soapenv:Header"的""部分中包含自定义牧羊器.我面临着检索传递到""部分中的详细信息的问题.没有例外,但我收到的都是后端RequestHeader对象的空属性值

我的SOAP请求如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://com/schema/OrderRequest" xmlns:ns="http://com/schema/RequestHeader">
   <soapenv:Header>
       <ns:RequestHeader>
        <ns:name>Name1</ns:name>
       </ns:RequestHeader>>
   </soapenv:Header>
   <soapenv:Body>
    .... no issue to retrieve body information
   </soapenv:Body>
 </soapenv:Envelope>

我try 使用以下代码检索标题部分

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "OrderRequest")
    @ResponsePayload
    public JAXBElement<OrderResponse> createOrder(@RequestPayload JAXBElement<OrderRequest>
            createWorkOrderRequestCplxType, @SoapHeader("{http://com/schema/RequestHeader/2/0}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); //This value is getting empty
        }catch (JAXBException e){
            e.printStackTrace();
        
        }
  }

你能帮我弄明白我做错了什么吗?

推荐答案

我try 了多种方法,但没有找到直接在PayloadRoot方法中获取RequestHeader的Java对象的直接解决方案.因此,能够使用以下替代方法进行管理:

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "OrderRequest")
    @ResponsePayload
    public JAXBElement<OrderResponse> createOrder(@RequestPayload JAXBElement<OrderRequest>
            createWorkOrderRequestCplxType, MessageContext messgeContext) {

        
        RequestHeader requestHeader = prepareRequestHeader(messageContext);
    
    
  }
  
  
  private RequestHeader prepareRequestHeader(MessageContext messageContext) {
   
    RequestHeader requestHeader = new RequestHeader();
    SoapHeader soapHeader = ((SoapMessage) messageContext.getRequest()).getSoapHeader();
    Iterator<?> elementIter = soapHeader.examineAllHeaderElements();
    while (elementIter.hasNext()) {

        Object element = elementIter.next();
        if (!(element instanceof SoapHeaderElement)) {
            continue;
        }

        Result result = ((SoapHeaderElement) element).getResult();
        if (!(result instanceof DOMResult)) {
            continue;
        }

        NodeList nodeList = ((DOMResult) result).getNode().getChildNodes();
        for (int i = 0; i < nodeList.getLength(); i++) {
            Node node = nodeList.item(i);
            if (node.hasChildNodes()) {
                String nodeName = node.getNodeName();
                String nodeValue = node.getFirstChild().getNodeValue();
                addValueToRequestHeader(requestHeader, nodeName, nodeValue);
            }
        }
    }
    
    return requestHeader;
}

private void addValueToRequestHeader(RequestHeader requestHeader, String nodeName, String nodeValue) {
    log.info("Start addValueToRequestHeader for nodeName : {} and nodeValue : {}", nodeName, nodeValue);
    switch (nodeName) {
        case "ns:name":
            requestHeader.setActivityName(nodeValue);
            break;
        case "ns:lastname":
            if (nodeValue.equalsIgnoreCase(RequestMessageType.NOTIFICATION.value())) {
                requestHeader.setMsgType(RequestMessageType.NOTIFICATION);
            } else {
                requestHeader.setMsgType(RequestMessageType.REQUEST);
            }
            break;
        case "ns:middlename":
            requestHeader.setSenderURI(nodeValue);
            break;   
        default:
            break;
    }
 
}
  

Java相关问答推荐

Jooq外键关系

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

我无法将附件发送到NetBeans之外

无法在WebSocket onMessage中捕获错误

Hibernate EmptyInterceptor可以工作,但不能拦截器

查找剩余的枚举

Spring @Value default无法计算表达式

如何让JVM在SIGSEGV崩溃后快速退出?

支持MySQL 5.6的最新Hibernate版本

一对多关系和ID生成

STREAMS减少部分结果的问题

如何根据配置动态创建N个bean

JOLT根据值删除并保留其余的json键

如何处理两个几乎相同的XSD文件?

为什么我的登录终结点不能被任何请求访问?

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

如何以事务方式向ibmmq发送消息

当我try 返回可选时,Mock无法正常工作

错误:JOIN/ON的参数必须是boolean类型,而不是bigint类型.Java Spring启动应用程序

如何转换Vector<;对象>;转换为int?