Дата демаршаллинга CXF не принимает значение NULL - PullRequest
0 голосов
/ 10 июля 2020

У меня есть файл WSDL, содержащий -

<xs:complexType name="PNV">
        <xs:sequence>
            <xs:element name="dataType" type="xsd:int" />
            <xs:element name="multiValued" type="xsd:boolean" />
            <xs:element name="booleanValue" type="xsd:boolean" />
            <xs:element name="dateValue" nillable="true" type="xsd:dateTime" />
            ..........

, и он преобразуется в Java файл следующим образом -

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "PNV", propOrder = {
    "dataType",
    "multiValued",
    "booleanValue",
    "dateValue",

})
public class PNV
    implements Serializable
{

    private final static long serialVersionUID = 1L;
    protected int dataType;
    protected boolean multiValued;
    protected boolean booleanValue;
    @XmlElement(required = true, type = String.class, nillable = true)
    @XmlJavaTypeAdapter(Adapter1 .class)
    @XmlSchemaType(name = "dateTime")
    protected Date dateValue;

}

файл привязки -

<jaxws:bindings  node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://changeservice.xxservices.service.xx']">      
    <jxb:globalBindings xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">        
    <jxb:javaType name="java.util.Date" xmlType="xs:dateTime" 
                  parseMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.parseDateTime"
                  printMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.printDateTime"/>    
        <jxb:serializable uid="1"/>     
    </jxb:globalBindings>  
</jaxws:bindings>

в моем тестовом примере SOAPUI, который я прошел -

<dateValue nil="true"/>

, но это дало мне следующую ошибку -

Caused by: java.lang.IllegalArgumentException: 
    at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parseAndSetYear(XMLGregorianCalendarImpl.java:2891) ~[na:1.8.0_201]
    at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl$Parser.parse(XMLGregorianCalendarImpl.java:2777) ~[na:1.8.0_201]
    at com.sun.org.apache.xerces.internal.jaxp.datatype.XMLGregorianCalendarImpl.<init>(XMLGregorianCalendarImpl.java:436) ~[na:1.8.0_201]
    at com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl.newXMLGregorianCalendar(DatatypeFactoryImpl.java:536) ~[na:1.8.0_201]
    at javax.xml.bind.DatatypeConverterImpl._parseDateTime(DatatypeConverterImpl.java:422) ~[na:1.8.0_201]
    at javax.xml.bind.DatatypeConverterImpl.parseDateTime(DatatypeConverterImpl.java:417) ~[na:1.8.0_201]
    at javax.xml.bind.DatatypeConverter.parseDateTime(DatatypeConverter.java:327) ~[na:1.8.0_201]
    at org.apache.cxf.xjc.runtime.DataTypeAdapter.parseDateTime(DataTypeAdapter.java:65) ~[cxf-xjc-runtime-3.3.1.jar:na]
    at org.w3._2001.xmlschema.Adapter1.unmarshal(Adapter1.java:13) ~[classes/:na]
    at org.w3._2001.xmlschema.Adapter1.unmarshal(Adapter1.java:1) ~[classes/:na]
    at com.sun.xml.bind.v2.runtime.reflect.AdaptedAccessor.set(AdaptedAccessor.java:55) ~[jaxb-runtime-2.3.3.jar:2.3.3]
    ... 107 common frames omitted

Я проверил атрибут даты в классе Adapter1, и вместо этого он становится пустым null, поэтому он выдает ошибку. Мой вопрос: почему он не принимает значение NULL, хотя я передаю nil = true в моем тестовом примере SOAPUI. почему он пуст? Я также попытался полностью удалить это поле dateValue из моего входного запроса, и он по-прежнему дает мне ту же ошибку для поля даты.

Я также пытался использовать XMLGregorianCalendar как тип dateValue, но когда я передал nil = true в SOAPUI это дает мне такое же сообщение об ошибке .. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 13 июля 2020

Мне помогла эта ссылка: https://blogs.oracle.com/rammenon/specifying-null-content-in-your-xml-document-using-nillable-and-xsi: nil

Я добавил xmlns: xsi = "http://www.w3.org/2001/XMLSchema-instance в свой тест SOAPUI и добавленную дату Значение как

<dateValue xsi:nil="true"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...