Использовать SOAP сервис из SpringBoot - @RequestBody получает нулевые значения - PullRequest
1 голос
/ 03 августа 2020

Я получаю нулевое значение для empID в запросе RequestControllers RequestBody MyReq. Когда я вызвал службу Rest, используя ниже JSON Request.

{
   "EmpID": [
      "1111","1234"
   ]
}

Это мой контроллер

    @SpringBootApplication
        @RestController
        public class MessageProcessorApplication {
        @Autowired
            private SoapClient client;
            
            @RequestMapping(value = "/getIdDetails", method = RequestMethod.POST)
            public MyRsp invokeSoapClient(@RequestBody MyReq request)
            {
                
                return client.getIdDetails(request);
            }
        
            }

My SoapClient class

@Service
    public class SoapClient {
    @Autowired
    private Jaxb2Marshaller marshaller;

    private WebServiceTemplate template;
    
    public MyRsp getIdDetails(MyReq request)
    {
        template = new WebServiceTemplate(marshaller);
        MyRsp response = (MyRsp) template.marshalSendAndReceive("http://localhost:8080/ws",request);
        return response;
    }
    }

jaxb сгенерировал MyReq и Классы EmpID из SOAP Service WSDL

@XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "empID"
    })
    @XmlRootElement(name = "MyReq")
    public class MyReq
        extends BaseReq
    {
    
        @XmlElement(name = "EmpID", required = true)
        protected List<EmpID> empID;
    
        public void setEmpID(List<EmpID> empID) {
            this.empID = empID;
        }
        public List<EmpID> getEmpID() {
            if (empID == null) {
                empID = new ArrayList<EmpID>();
            }
            return this.empID;
        }
    
    }
    
    }

сгенерированный класс EmpID

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "value"
})
@XmlRootElement(name = "EmpID")
public class EmpID {

    @XmlValue
    protected String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

Я пробовал использовать empID также в JSON Request. Я все еще получаю нулевые значения.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Возможно, вы столкнулись с этой проблемой . Вам также необходимо передать значение EmpID в конструктор.

Я могу заставить ваш пример работать, если я изменю ваши сгенерированные классы на ...

MyReq. java

package com.example.demo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.List;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "MyReq")
public class MyReq
{
    @XmlElement(required = true)
    protected List<EmpID> empIds;

    public List<EmpID> getEmpIds() {
        return empIds;
    }

    public void setEmpIds(List<EmpID> empIds) {
        this.empIds = empIds;
    }
}

EmpID. java

package com.example.demo;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
public class EmpID {

    public EmpID(String value) {
        this.value = value;
    }

    @XmlValue
    protected String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

Затем вам нужно будет опубликовать json как ...

{
    "empIds": ["1111","1234"]
}
0 голосов
/ 03 августа 2020

попробуйте с этим json запросом.

{
    "empID": [
        {
            "value": "111"
        },
        {
            "value": "222"
        }
    ]
}
...