#java #xml #soap
#java #xml #soap
Вопрос:
У меня проблема с обработкой запроса SOAP. Я могу прочитать все из конверта, но параметр, оформленный пробелом имени (cs: measurand), не может быть проанализирован.
Здесь вы можете найти конверт SOAP:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:cs="urn://Ocpp/Cs/2012/06/" xmlns:soap-enc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Header>
<cs:identity>17083A00001101</cs:identity>
<a:From>
<a:Address>http://172.0.0.0:9080</a:Address>
</a:From>
<a:MessageID>urn:uuid:xxxxxxxxxxxx</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To>http://172.0.0.0:8080/ws/ocp</a:To>
<a:Action>/MValues</a:Action>
</soap:Header>
<soap:Body>
<cs:mValuesRequest>
<cs:id>1</cs:id>
<cs:transactionId>1881</cs:transactionId>
<cs:values>
<cs:timestamp>2019-03-07T13:41:52.405Z</cs:timestamp>
<cs:value cs:measurand="e.a.i.r" cs:unit="Wh">300</cs:value>
<cs:value cs:measurand="c.i" cs:unit="Amp">38.5</cs:value>
<cs:value cs:measurand="v" cs:unit="Volt">399.5</cs:value>
<cs:value cs:measurand="p.a.i" cs:unit="W">15380</cs:value>
<cs:value cs:measurand="t" cs:unit="Celsius">35</cs:value>
</cs:values>
</cs:mValuesRequest>
</soap:Body>
</soap:Envelope>
Вот служба, которая получает запрос:
@Action("/MValues")
@ResponsePayload
public JAXBElement<MValuesResponse> receive(@RequestPayload MValuesRequest request,
MessageContext messageContext) {
....
}
И вот MValuesRequest:
...
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ValuesRequest", propOrder = {
"id",
"transactionId",
"values"
})
public class MValuesRequest {
protected int id;
protected Integer transactionId;
protected List<MValue> values;
// getters setters...
}
Любые ваши мысли были бы действительно оценены.
Ответ №1:
попробуйте с этим,
MValuesRequest.java
@XmlRootElement(name="cs:mValuesRequest")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name ="ValuesRequest", propOrder = { "id", "transactionId", "values" })
public class MValuesRequest {
@XmlElement(name="cs:id")
protected int id;
@XmlElement(name="cs:transactionId")
protected Integer transactionId;
@XmlElement(name="cs:values")
protected Values values;
// getters and setters...
}
Values.java
@XmlRootElement(name="cs:values")
public class Values{
@XmlElement(name="cs:timestamp")
protected String timestamp;
@XmlElement(name="cs:value")
protected List<Value> value;
// getters and setters...
}
Value.java
@XmlRootElement(name="cs:value")
public class value{
@XmlAttribute(name="measurand" namespace="http://www.w3.org/XML/1998/namespace")
protected String measurand;
@XmlAttribute(name="unit" namespace="http://www.w3.org/XML/1998/namespace")
protected String unit;
@XmlValue
protected String elementValue;
// getters and setters...
}
Комментарии:
1. Спасибо, Ратнаяке! К сожалению, у меня тот же результат, когда я выполняю разнесение.
Ответ №2:
Я, наконец, смог решить эту проблему, большое спасибо Rathnayake.
Мне не нужно было добавлять @XmlRootElement, а только добавить параметр пространства имен в @XmlAttribute.
Итак, в настоящее время мои параметры XML выглядят следующим образом:
@XmlAttribute(name = "context", namespace="urn://Ocpp/Cs/2012/06/")
protected ReadingContext context;
@XmlAttribute(name = "format", namespace="urn://Ocpp/Cs/2012/06/")
protected ValueFormat format;
@XmlAttribute(name = "measurand", namespace="urn://Ocpp/Cs/2012/06/")
protected Measurand measurand;
@XmlAttribute(name = "location", namespace="urn://Ocpp/Cs/2012/06/")
protected Location location;
@XmlAttribute(name = "unit", namespace="urn://Ocpp/Cs/2012/06/")
protected UnitOfMeasure unit;
Просто чтобы помнить, вот мой заголовок SOAP:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:cs="urn://Ocpp/Cs/2012/06/" xmlns:soap-enc="http://www.w3.org/2003/05/soap-encoding" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
И я добавил в качестве namespace=»…» значение xmlns: cs=»…» из заголовка.