XML deserialization : same localname but differents namespaces.

1,021 views
Skip to first unread message

Adrien Quentin

unread,
Jul 20, 2017, 10:34:39 AM7/20/17
to jackson-user
Hello,

I'm trying to use jackson deserialization to parse and map java object. Work fine except when the xml contains two same local names in differents namespaces, like this : 


<wfs:FeatureCollection>
<wfs:member>
<gsmlp:BoreholeView gml:id="XXXXXX">
<gml:description>Borehole description</gml:description>
<gml:identifier codeSpace="http://www.ietf.org/rfc/rfc2616">
XXXXX
</gml:identifier>
<gsmlp:identifier>
XXXXX2
</gsmlp:identifier>
</gsmlp:BoreholeView>
</wfs:member>
</wfs:FeatureCollection>
Setup my bean (boreholeview) like this : 


@JacksonXmlElementWrapper(namespace = "gsmlp",localName = "identifier")
String identifier;

@JacksonXmlElementWrapper(namespace = "gml",localName = "identifier")
String gmlIdentifier;

jackson raised the exception below, it seems that the uniqueness is ensure by localname without the use of namespace, is there any parameter to solve this ? 

com.fasterxml.jackson.databind.JsonMappingException: Duplicate property 'identifier' for [simple type, class fr.brgm.wfsBoreHoleViewHarvester.model.xmlBean.BoreHoleView]
 at [Source: com.ctc.wstx.sr.ValidatingStreamReader@6200f9cb; line: 1, column: 39]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:305)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:268)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:466)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:479)
at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:61)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findNonContextualValueDeserializer(DeserializationContext.java:466)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.resolve(BeanDeserializerBase.java:479)
at com.fasterxml.jackson.databind.deser.std.DelegatingDeserializer.resolve(DelegatingDeserializer.java:61)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:293)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:476)
at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3915)
at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3781)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2181)
at com.fasterxml.jackson.dataformat.xml.XmlMapper.readValue(XmlMapper.java:221)
at com.fasterxml.jackson.dataformat.xml.XmlMapper.readValue(XmlMapper.java:196)
at fr.brgm.wfsBoreHoleViewHarvester.parse.XmlParserMapper.parse(XmlParserMapper.java:21)
at fr.brgm.wfsConsumer.xmlParsingMappingTest.testxmlParsingFullPage1000elements(xmlParsingMappingTest.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at junit.framework.TestCase.runTest(TestCase.java:176)
at junit.framework.TestCase.runBare(TestCase.java:141)
at junit.framework.TestResult$1.protect(TestResult.java:122)
at junit.framework.TestResult.runProtected(TestResult.java:142)
at junit.framework.TestResult.run(TestResult.java:125)
at junit.framework.TestCase.run(TestCase.java:129)
at junit.framework.TestSuite.runTest(TestSuite.java:252)
at junit.framework.TestSuite.run(TestSuite.java:247)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:86)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: java.lang.IllegalArgumentException: Duplicate property 'identifier' for [simple type, class fr.brgm.wfsBoreHoleViewHarvester.model.xmlBean.BoreHoleView]
at com.fasterxml.jackson.databind.deser.BeanDeserializerBuilder.addProperty(BeanDeserializerBuilder.java:172)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:612)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:258)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:173)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:403)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
... 40 more


thank you
Kind Regards
Adrien.

Tatu Saloranta

unread,
Aug 3, 2017, 1:09:56 AM8/3/17
to jackson-user
On Thu, Jul 20, 2017 at 6:06 AM, Adrien Quentin <adri1....@gmail.com> wrote:
Hello,

I'm trying to use jackson deserialization to parse and map java object. Work fine except when the xml contains two same local names in differents namespaces, like this : 


<wfs:FeatureCollection>
<wfs:member>
<gsmlp:BoreholeView gml:id="XXXXXX">
<gml:description>Borehole description</gml:description>
<gml:identifier codeSpace="http://www.ietf.org/rfc/rfc2616">
XXXXX
</gml:identifier>
<gsmlp:identifier>
XXXXX2
</gsmlp:identifier>
</gsmlp:BoreholeView>
</wfs:member>
</wfs:FeatureCollection>
Setup my bean (boreholeview) like this : 


@JacksonXmlElementWrapper(namespace = "gsmlp",localName = "identifier")
String identifier;

@JacksonXmlElementWrapper(namespace = "gml",localName = "identifier")
String gmlIdentifier;

jackson raised the exception below, it seems that the uniqueness is ensure by localname without the use of namespace, is there any parameter to solve this ? 



Unfortunately this is a known but unsolved problem -- local names have to be unique as is.
A related issue is at:


About the only work-around currently would be to disable namespace handling of underlying parser (Woodstox, or other Stax implementation),
in which case property names would need to include namespace prefix explicitly.
But it would work.

-+ Tatu +-

 
Reply all
Reply to author
Forward
0 new messages