【问题标题】:How to Read SOAP API Request Headers Using Java Spring如何使用 Java Spring 读取 SOAP API 请求标头
【发布时间】:2021-05-04 13:09:18
【问题描述】:

下面是我的soap请求,我需要使用spring boot java读取soap头我该怎么做。 尝试了所有可能的情况,我能够在没有目标命名空间的情况下读取标头,但如果我涉及目标命名空间,它会给我一个空指针异常错误。提前感谢您的帮助。

需要解决方案的实际需求:

<soap11:Envelope xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/">
    <soap11:Header>
        <NS1:CUSTOMERNAME xmlns:NS1="http://www.example.org/EcCustom67ARequest/">XmasTree</NS1:CUSTOMERNAME>
        <NS2:EMPID xmlns:NS2="http://www.example.org/EcCustom67ARequest/">kite123</NS2:EMPID>
    </soap11:Header>
    <soap11:Body>
        <clientNS:EcCustom67A xmlns:clientNS="http://www.example.org/EcCustom67ARequest/">
            <clientNS:PAYMENT_MODE>NEFT</clientNS:PAYMENT_MODE>
            <clientNS:VAN>AUT1123456</clientNS:VAN>
            <clientNS:AMOUNT>1000.00</clientNS:AMOUNT>
            <clientNS:CREDIT_ACCOUNT_NUMBER>124236541582</clientNS:CREDIT_ACCOUNT_NUMBER>
            <clientNS:CUSTOMER_CODE>AUT1</clientNS:CUSTOMER_CODE>
            <clientNS:TRANSACTION_DATE>30-04-2021</clientNS:TRANSACTION_DATE>
            <clientNS:ADD_INFO>Collection</clientNS:ADD_INFO>
        </clientNS:EcCustom67A>
    </soap11:Body>
</soap11:Envelope>

无需目标命名空间即可:

<soapenv:Envelope
  xmlns:soapenv = "http://schemas.xmlsoap.org/soap/envelope/"
  xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
  xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
  xmlns:ns2 = "http://www.example.org/EcCustom67ARequest/" elementFormDefault="qualified">
    <soapenv:Header> 
            <CUSTOMERNAME>XmasTree</CUSTOMERNAME>
            <EMPID>kite123</EMPID> 
  </soapenv:Header>
    <soapenv:Body>
        <ns2:EcCustom67A soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" elementFormDefault="qualified">
            <ns2:PAYMENT_MODE>NEFT</ns2:PAYMENT_MODE> 
            <ns2:VAN>ADAN12345678</ns2:VAN>
            <ns2:AMOUNT>1000</ns2:AMOUNT>
            <ns2:CREDIT_ACCOUNT_NUMBER>108328359093</ns2:CREDIT_ACCOUNT_NUMBER>
            <ns2:CUSTOMER_CODE>ADAN</ns2:CUSTOMER_CODE>
            <ns2:TRANSACTION_DATE>17-11-2020 13:10:12</ns2:TRANSACTION_DATE>
            <ns2:ADD_INFO>Collection</ns2:ADD_INFO>
        </ns2:EcCustom67A>
    </soapenv:Body>
</soapenv:Envelope>

工作代码

@Endpoint
public class EcCustom67AEndPoint {

    private static final String NAMESPACE_URI = "http://www.example.org/EcCustom67ARequest/";

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "EcCustom67A")
    @ResponsePayload
    public EcCustom67AResponse getEcCustom67A(@RequestPayload EcCustom67A request,
            @SoapHeader(value = "CUSTOMERNAME") SoapHeaderElement customerName,
            @SoapHeader(value = "EMPID") SoapHeaderElement empid) throws JAXBException {
        EcCustom67AResponse response = new EcCustom67AResponse();

        String custName = customerName.getText();
        String empID = empid.getText();
        
        response.setAMOUNT(request.getAMOUNT().replaceAll(",", ","));
        response.setCREDITACCOUNTNUMBER(request.getCREDITACCOUNTNUMBER());
        response.setCUSTOMERCODE(request.getCUSTOMERCODE());
        response.setVAN(request.getVAN());
        response.setPAYMENTMODE(request.getPAYMENTMODE());
        response.setTRANSACTIONDATE(request.getTRANSACTIONDATE());
        response.setADDINFO(request.getADDINFO());


    
            if (custName.equals("XmasTree") && empID.equals("kite123")) {
                if (response.getAMOUNT() != null) {
                    if (Float.parseFloat(response.getAMOUNT().replaceAll(",", "")) >= 1000) {
                        response.setSTATUS("Success");
                        response.setREMARKS("Beneficiary Account Credited");
                    } else if (Float.parseFloat(response.getAMOUNT().replaceAll(",", "")) < 1000) {
                        response.setSTATUS("Reject");
                        response.setREMARKS("Transaction Failed");
                    }
                } else {
                    response.setSTATUS("Reject");
                    response.setREMARKS("Transaction Failed");
                }
            
        } else{
            response.setPAYMENTMODE(null);
            response.setVAN(null);
            response.setAMOUNT(null);
            response.setCREDITACCOUNTNUMBER(null);
            response.setCUSTOMERCODE(null);
            response.setTRANSACTIONDATE(null);
            response.setADDINFO(null);

            response.setSTATUS("Reject");
            response.setREMARKS("Invalid Authentication");

            JAXBContext jc = JAXBContext.newInstance(IPValAllField219Response.class);
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        }

        
        return response;
    }

}

注意:工作代码在没有目标名称 spce 的情况下完成这项工作,但如果我包含目标名称 spce,它会给我空指针异常请帮助解决上述问题并提前致谢。

【问题讨论】:

    标签: java spring-boot api soap


    【解决方案1】:

    我正在使用 Spring Boot 的 @RestController 并且(至少)有两种方法我可以想到这样做:

    1. 您的端点方法有一个 HttpServletRequest 类型的参数,Spring 会自动为您填充该参数。然后,如果您将其命名为 request,则可以在您的代码中执行 request.getHeader(HttpHeaders.AUTHORIZATION) 之类的操作。

    2. 您的端点方法有一个用@RequestHeader("My-Header-Name") String myHeaderName 注释的参数,然后在您的代码中根据需要读取myHeaderName

    【讨论】:

    • 肥皂,兄弟,不要休息! ;)
    • 是的,当然,我认为这可能会引发一些想法。像@SoapHeader@RequestHeader 非常相似
    【解决方案2】:

    你试过了吗:

     @SoapHeader("{http://www.example.org/EcCustom67ARequest/}CUSTOMERNAME") ...,
     @SoapHeader("{http://www.example.org/EcCustom67ARequest/}EMPID") ...
    

    ?

    在soap标头上设置命名空间看起来是正确的方法:

    1. https://docs.spring.io/spring-ws/docs/current/org/springframework/ws/soap/server/endpoint/annotation/SoapHeader.html
    2. https://docs.oracle.com/javase/8/docs/api/javax/xml/namespace/QName.html?is-external=true#toString--

    【讨论】:

    • 非常感谢它对我有用。非常感谢。
    • 很高兴,它有帮助!请考虑采纳答案! ;) 欢迎来到Stack Overflow! :-)
    • 嘿嗨,如果我需要恢复相同的标题作为响应,怎么可能?提前致谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    相关资源
    最近更新 更多