Проблема с демаршаллированным пространством имен SOAP XML-параметра - PullRequest
0 голосов
/ 27 марта 2019

У меня проблема с обработкой SOAP-запроса.Я могу прочитать все из конверта, но не может быть проанализирован параметр, оформленный в пространстве имен (cs: measureurand).

Здесь вы можете найти конверт 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...


}

Любые ваши мысли будут по достоинству оценены.

Ответы [ 2 ]

0 голосов
/ 03 апреля 2019

Я наконец-то смог решить эту проблему, большое спасибо Ратнаяке.

Мне не нужно было добавлять @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 = "..." из заголовка.

0 голосов
/ 28 марта 2019

попробуйте с этим,

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...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...