从SpringBoot消费SOAP服务 – @RequestBody获取null值

huangapple go评论162阅读模式
英文:

Consume SOAP Service from SpringBoot - @RequestBody getting null values

问题

I am getting null value for empID in RequestControllers RequestBody MyReq request. When I called Rest Service using below JSON Request.

我在调用Rest服务时,发现在RequestControllers的RequestBody MyReq请求中,empID的值为null。使用以下JSON请求时出现的问题。

  1. {
  2. "EmpID": [
  3. "1111","1234"
  4. ]
  5. }

This is my Controller

这是我的控制器

  1. @SpringBootApplication
  2. @RestController
  3. public class MessageProcessorApplication {
  4. @Autowired
  5. private SoapClient client;
  6. @RequestMapping(value = "/getIdDetails", method = RequestMethod.POST)
  7. public MyRsp invokeSoapClient(@RequestBody MyReq request) {
  8. return client.getIdDetails(request);
  9. }
  10. }

My SoapClient class

我的SoapClient类

  1. @Service
  2. public class SoapClient {
  3. @Autowired
  4. private Jaxb2Marshaller marshaller;
  5. private WebServiceTemplate template;
  6. public MyRsp getIdDetails(MyReq request) {
  7. template = new WebServiceTemplate(marshaller);
  8. MyRsp response = (MyRsp) template.marshalSendAndReceive("http://localhost:8080/ws", request);
  9. return response;
  10. }
  11. }

JAXB generated MyReq and EmpID classes from SOAP Service WSDL

从SOAP服务的WSDL生成的JAXB MyReq和EmpID类

  1. @XmlAccessorType(XmlAccessType.FIELD)
  2. @XmlType(name = "", propOrder = {
  3. "empID"
  4. })
  5. @XmlRootElement(name = "MyReq")
  6. public class MyReq extends BaseReq {
  7. @XmlElement(name = "EmpID", required = true)
  8. protected List<EmpID> empID;
  9. public void setEmpID(List<EmpID> empID) {
  10. this.empID = empID;
  11. }
  12. public List<EmpID> getEmpID() {
  13. if (empID == null) {
  14. empID = new ArrayList<EmpID>();
  15. }
  16. return this.empID;
  17. }
  18. }

Generated EmpID class

生成的EmpID类

  1. @XmlAccessorType(XmlAccessType.FIELD)
  2. @XmlType(name = "", propOrder = {
  3. "value"
  4. })
  5. @XmlRootElement(name = "EmpID")
  6. public class EmpID {
  7. @XmlValue
  8. protected String value;
  9. public String getValue() {
  10. return value;
  11. }
  12. public void setValue(String value) {
  13. this.value = value;
  14. }
  15. }

I have tried with empID also in JSON Request. Still null values I am getting.

我尝试在JSON请求中使用了empID,但仍然获取到了null值。

英文:

I am getting null value for empID in RequestControllers RequestBody MyReq request. When I called Rest Service using below JSON Request.

  1. {
  2. &quot;EmpID&quot;: [
  3. &quot;1111&quot;,&quot;1234&quot;
  4. ]
  5. }

This is my Controller

  1. @SpringBootApplication
  2. @RestController
  3. public class MessageProcessorApplication {
  4. @Autowired
  5. private SoapClient client;
  6. @RequestMapping(value = &quot;/getIdDetails&quot;, method = RequestMethod.POST)
  7. public MyRsp invokeSoapClient(@RequestBody MyReq request)
  8. {
  9. return client.getIdDetails(request);
  10. }
  11. }

My SoapClient class

  1. @Service
  2. public class SoapClient {
  3. @Autowired
  4. private Jaxb2Marshaller marshaller;
  5. private WebServiceTemplate template;
  6. public MyRsp getIdDetails(MyReq request)
  7. {
  8. template = new WebServiceTemplate(marshaller);
  9. MyRsp response = (MyRsp) template.marshalSendAndReceive(&quot;http://localhost:8080/ws&quot;,request);
  10. return response;
  11. }
  12. }

jaxb generated MyReq and EmpID classes from SOAP Service WSDL

  1. @XmlAccessorType(XmlAccessType.FIELD)
  2. @XmlType(name = &quot;&quot;, propOrder = {
  3. &quot;empID&quot;
  4. })
  5. @XmlRootElement(name = &quot;MyReq&quot;)
  6. public class MyReq
  7. extends BaseReq
  8. {
  9. @XmlElement(name = &quot;EmpID&quot;, required = true)
  10. protected List&lt;EmpID&gt; empID;
  11. public void setEmpID(List&lt;EmpID&gt; empID) {
  12. this.empID = empID;
  13. }
  14. public List&lt;EmpID&gt; getEmpID() {
  15. if (empID == null) {
  16. empID = new ArrayList&lt;EmpID&gt;();
  17. }
  18. return this.empID;
  19. }
  20. }
  21. }

generated EmpID class

  1. @XmlAccessorType(XmlAccessType.FIELD)
  2. @XmlType(name = &quot;&quot;, propOrder = {
  3. &quot;value&quot;
  4. })
  5. @XmlRootElement(name = &quot;EmpID&quot;)
  6. public class EmpID {
  7. @XmlValue
  8. protected String value;
  9. public String getValue() {
  10. return value;
  11. }
  12. public void setValue(String value) {
  13. this.value = value;
  14. }
  15. }

I have tried with empID also in JSON Request. Still null values I am getting.

答案1

得分: 1

以下是翻译好的内容:

你可能遇到了这个问题。你还需要在构造函数中传递EmpID的值。

如果我将你生成的类更改为以下内容,我可以让你的示例运行...

MyReq.java

  1. package com.example.demo;
  2. import javax.xml.bind.annotation.XmlAccessType;
  3. import javax.xml.bind.annotation.XmlAccessorType;
  4. import javax.xml.bind.annotation.XmlElement;
  5. import javax.xml.bind.annotation.XmlRootElement;
  6. import java.util.List;
  7. @XmlAccessorType(XmlAccessType.FIELD)
  8. @XmlRootElement(name = "MyReq")
  9. public class MyReq
  10. {
  11. @XmlElement(required = true)
  12. protected List<EmpID> empIds;
  13. public List<EmpID> getEmpIds() {
  14. return empIds;
  15. }
  16. public void setEmpIds(List<EmpID> empIds) {
  17. this.empIds = empIds;
  18. }
  19. }

EmpID.java

  1. package com.example.demo;
  2. import javax.xml.bind.annotation.XmlAccessType;
  3. import javax.xml.bind.annotation.XmlAccessorType;
  4. import javax.xml.bind.annotation.XmlValue;
  5. @XmlAccessorType(XmlAccessType.FIELD)
  6. public class EmpID {
  7. public EmpID(String value) {
  8. this.value = value;
  9. }
  10. @XmlValue
  11. protected String value;
  12. public String getValue() {
  13. return value;
  14. }
  15. public void setValue(String value) {
  16. this.value = value;
  17. }
  18. }

然后,你需要将你的 JSON 提交为...

  1. {
  2. "empIds": ["1111","1234"]
  3. }
英文:

You may be running into this problem. You also need to pass the value of EmpID in the constructor.

I can get your example to work if I change your generated classes to...

MyReq.java

  1. package com.example.demo;
  2. import javax.xml.bind.annotation.XmlAccessType;
  3. import javax.xml.bind.annotation.XmlAccessorType;
  4. import javax.xml.bind.annotation.XmlElement;
  5. import javax.xml.bind.annotation.XmlRootElement;
  6. import java.util.List;
  7. @XmlAccessorType(XmlAccessType.FIELD)
  8. @XmlRootElement(name = &quot;MyReq&quot;)
  9. public class MyReq
  10. {
  11. @XmlElement(required = true)
  12. protected List&lt;EmpID&gt; empIds;
  13. public List&lt;EmpID&gt; getEmpIds() {
  14. return empIds;
  15. }
  16. public void setEmpIds(List&lt;EmpID&gt; empIds) {
  17. this.empIds = empIds;
  18. }
  19. }

EmpID.java

  1. package com.example.demo;
  2. import javax.xml.bind.annotation.XmlAccessType;
  3. import javax.xml.bind.annotation.XmlAccessorType;
  4. import javax.xml.bind.annotation.XmlValue;
  5. @XmlAccessorType(XmlAccessType.FIELD)
  6. public class EmpID {
  7. public EmpID(String value) {
  8. this.value = value;
  9. }
  10. @XmlValue
  11. protected String value;
  12. public String getValue() {
  13. return value;
  14. }
  15. public void setValue(String value) {
  16. this.value = value;
  17. }
  18. }

You would then need to post your json as...

  1. {
  2. &quot;empIds&quot;: [&quot;1111&quot;,&quot;1234&quot;]
  3. }

答案2

得分: 0

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

英文:

try with this json request.

  1. {
  2. &quot;empID&quot;: [
  3. {
  4. &quot;value&quot;: &quot;111&quot;
  5. },
  6. {
  7. &quot;value&quot;: &quot;222&quot;
  8. }
  9. ]
  10. }

huangapple
  • 本文由 发表于 2020年8月3日 08:47:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/63222382.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定