1

I am using Spring boot deployed to Weblogic 12.1.3.0.0. I am experiencing issues with the way dates are being unmarshalled on XML input.

I am supplying valid ISO-8601 dates and the format of the timezone offset is causing a org.eclipse.persistence.exceptions.ConversionException.

From the stacktrace, it shows the version of eclipselink as: eclipselink.jar:2.5.2.v20140319-9ad6abd

This date is handled correctly:

2015-11-02T11:15:47.239-05:00

While this one causes the exception:

2015-11-02T11:15:47.239-0500

According to the spec, both are valid.

The provided Jackson unmarshaller is handling this format correctly.

I cannot ask clients to reformat the input as this format is the default output when clients request application/json in the Accept-Type.

Do I need to swap out eclipselink?

org.eclipse.persistence.exceptions.ConversionException: 
Exception Description: Incorrect date-time format: [2015-11-02T11:15:47.239-0500] (expected [YYYY-MM-DDTHH:MM:SS])
    at org.eclipse.persistence.exceptions.ConversionException.incorrectDateTimeFormat(ConversionException.java:135) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.exceptions.ConversionException.incorrectDateTimeFormat(ConversionException.java:141) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertStringToXMLGregorianCalendar(XMLConversionManager.java:750) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertObjectToXMLGregorianCalendar(XMLConversionManager.java:290) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertObject(XMLConversionManager.java:259) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.oxm.XMLField.convertValueBasedOnSchemaType(XMLField.java:723) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.oxm.record.XMLReader.convertValueBasedOnSchemaType(XMLReader.java:140) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.oxm.XMLDirectMappingNodeValue.endElement(XMLDirectMappingNodeValue.java:191) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.oxm.record.UnmarshalRecordImpl.endElement(UnmarshalRecordImpl.java:1022) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1781) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2957) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) ~[na:1.7.0_51]
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) ~[na:1.7.0_51]
    at org.eclipse.persistence.internal.oxm.record.XMLReader.parse(XMLReader.java:223) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:401) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.internal.oxm.record.SAXUnmarshaller.unmarshal(SAXUnmarshaller.java:654) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.oxm.XMLUnmarshaller.unmarshal(XMLUnmarshaller.java:593) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:287) ~[eclipselink.jar:2.5.2.v20140319-9ad6abd]
    at org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.readFromSource(Jaxb2RootElementHttpMessageConverter.java:133) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.readInternal(AbstractXmlHttpMessageConverter.java:61) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:161) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:214) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:147) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:125) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:78) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:814) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:737) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) ~[spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:751) [weblogic.server.merged.jar:12.1.3.0.0]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) [spring-webmvc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:844) [weblogic.server.merged.jar:12.1.3.0.0]
Xstian
  • 8,184
  • 10
  • 42
  • 72
DBeck
  • 11
  • 1

1 Answers1

0

The code shows EclipseLink is using a DatatypeFactoryImpl and passing in the string to the newXMLGregorianCalendar method. The link I found states it matches newXMLGregorianCalendar(x).toXMLFormat().equals(x), and the javadoc for newXMLGregorianCalendar points to it using http://www.w3.org/TR/xmlschema-2/#isoformats which does not cover all lexical representations of iso 8601.

I don't know if there is a way to change the implementation used internally for the conversion - someone more knowledgeable might be able to help further. But you can change what gets used by defining a XmlAdapter on the mapping to handle the formatting for you.

Community
  • 1
  • 1
Chris
  • 20,138
  • 2
  • 29
  • 43