Ok, couple of notes:
1. Jackson does not know or care about XSD: the only thing that
matters is generated Java class(es)
2. If using JAXB annotations, make sure to register
JAXBAnnotationIntrospector: by default Jackson only uses its own
annotations;
but `AnnotationIntrospector` allows supporting non-native
annotation sets too, such as JAXB ones.
3. A good way to troubleshoot structural mismatch is to take an
object, then serialize it (write) as xml, see if that match, and if
not, how
4. A common structural mismatch is for List/Collection values,
regarding whether there is a wrapper element for property (in addition
to elements per value) -- by default JAXB DOES NOT use them, and by
default Jackson DOES use wrappers. You may want to
disable use of wrappers either on per-property basis (there's a
Jackson annotation for that), or, as default for all properties.
I hope this helps,
-+ Tatu +-
On Thu, Apr 5, 2018 at 8:18 AM, Marte Marte <[email protected]> wrote:
> Hello everyone,
> I hope to find some help on this "strange" issue or a different look to
> this problem.
>
> Let's start from a simple xsd, like this one:
>
>
>> <xs:schema xmlns:fls="http://flussi.mds.it/flsassdom_1"
>> xmlns:xs="http://www.w3.org/2001/XMLSchema"
>> targetNamespace="http://flussi.mds.it/flsassdom_1"
>> elementFormDefault="qualified"
>> attributeFormDefault="unqualified">
>> <xs:element name="FlsAssDom_1">
>> <xs:complexType>
>> <xs:sequence>
>> <xs:element ref="fls:Residenza" maxOccurs="unbounded"/>
>> </xs:sequence>
>> </xs:complexType>
>> </xs:element>
>> <xs:element name="Residenza">
>> <xs:complexType>
>> <xs:sequence>
>> <xs:element name="ASL" type="fls:codASL"/>
>> </xs:sequence>
>> </xs:complexType>
>> </xs:element>
>> <xs:simpleType name="codASL">
>> <xs:restriction base="xs:string">
>> <xs:pattern value="[a-zA-Z0-9]{3}"/>
>> </xs:restriction>
>> </xs:simpleType>
>> </xs:schema>
>>
>
> From this xsd from Eclipse using "default" jaxb implementation I have
> generated corresponding classes.
> Now, if I start from following example xml:
>
> <?xml version="1.0" encoding="utf-8"?>
> <FlsAssDom_1 xmlns="http://flussi.mds.it/flsassdom_1">
> <Residenza>
> <ASL>123</ASL>
> </Residenza>
> </FlsAssDom_1>
>
>
> And try to use it with Jackson:
>
>
>> public class MapperTest {
>>
>> @Test
>> public void simpleMapperTest() throws JsonParseException,
>> JsonMappingException, IOException {
>> XmlMapper mapper = new XmlMapper();
>> File f = new
>> File(this.getClass().getResource("example.xml").getFile());
>>
>> FlsAssDom1 read = mapper.readValue(f, FlsAssDom1.class);
>>
>> assertTrue(read != null);
>> }
>>
>> }
>
>
>
> And what I receive is the following exception:
>
>
>> com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:
>> Unrecognized field "Residenza" (class it.test.model.FlsAssDom1), not marked
>> as ignorable (one known property: "residenza"])
>> at [Source: (File); line: 4, column: 9] (through reference chain:
>> it.test.model.FlsAssDom1["Residenza"])
>> at
>> com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
>> at
>> com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:822)
>> at
>> com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1152)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1582)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1560)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:294)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
>> at
>> com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001)
>> at
>> com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2890)
>> at MapperTest.simpleMapperTest(MapperTest.java:21)
>> 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
>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
>> at
>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>> at
>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
>> at
>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
>> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
>> at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
>> at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
>> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
>> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
>> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
>> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
>> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
>> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
>> at
>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
>> at
>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
>
>
> My generated class "" is the following:
>
>
>> @XmlAccessorType(XmlAccessType.FIELD)
>> @XmlType(name = "", propOrder = {
>> "residenza"
>> })
>> @XmlRootElement(name = "FlsAssDom_1")
>> public class FlsAssDom1 {
>>
>> @XmlElement(name = "Residenza", required = true)
>> protected List<Residenza> residenza;
>
>
>
> My generated class "Residenza" is the following:
>
>
>> @XmlAccessorType(XmlAccessType.FIELD)
>> @XmlType(name = "", propOrder = {
>> "asl"
>> })
>> @XmlRootElement(name = "Residenza")
>> public class Residenza {
>>
>> @XmlElement(name = "ASL", required = true)
>> protected String asl;
>>
>> /**
>> * Recupera il valore della proprietà asl.
>> *
>> * @return
>> * possible object is
>> * {@link String }
>> *
>> */
>> public String getASL() {
>> return asl;
>> }
>>
>> /**
>> * Imposta il valore della proprietà asl.
>> *
>> * @param value
>> * allowed object is
>> * {@link String }
>> *
>> */
>> public void setASL(String value) {
>> this.asl = value;
>> }
>>
>> }
>
>
>
> As you can see, in xsd the field is "Residenza", in xml is "Residenza" and
> in the XmlRootElement is "Residenza". In the class "FlsAssDom1 " there is a:
>
>> @XmlType(name = "", propOrder = {
>> "residenza"
>> })
>
>
> with lowercase.
>
> After some investigation, I have tried enabling the feature
> "MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES":
>
>
>> @Test
>> public void caseInsensitiveFeatureMapperTest() throws
>> JsonParseException, JsonMappingException, IOException {
>> XmlMapper mapper = new XmlMapper();
>> mapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
>> File f = new
>> File(this.getClass().getResource("example.xml").getFile());
>>
>> FlsAssDom1 read = mapper.readValue(f, FlsAssDom1.class);
>>
>> assertTrue(read != null);
>> }
>
>
> And the error is different:
>
>
>> com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot
>> construct instance of `it.test.model.Residenza` (although at least one
>> Creator exists): no String-argument constructor/factory method to
>> deserialize from String value ('123')
>> at [Source: (File); line: 4, column: 12] (through reference chain:
>> it.test.model.FlsAssDom1["Residenza"]->java.util.ArrayList[0])
>> at
>> com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
>> at
>> com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1342)
>> at
>> com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1031)
>> at
>> com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371)
>> at
>> com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1366)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:171)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161)
>> at
>> com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
>> at
>> com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
>> at
>> com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
>> at
>> com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:136)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
>> at
>> com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
>> at
>> com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4001)
>> at
>> com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2890)
>> at MapperTest.caseInsensitiveFeatureMapperTest(MapperTest.java:34)
>> 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
>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
>> at
>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>> at
>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
>> at
>> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
>> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
>> at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
>> at
>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
>> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
>> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
>> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
>> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
>> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
>> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
>> at
>> org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
>> at
>> org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
>> at
>> org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
>
>
>
> My ideas:
>
> 1) generate classes from xsd using Eclipse Oxygen.3 Release (4.7.3) is
> broken somewhere
> 2) it's better if I use some sort of bindings during xsd->java generation ?
> But xsd and xml are consistent each other
> 3) do you suggest to open an issue on github and report this problem and ask
> for support? I can provide a self-contained project that reproduce the
> problem
>
> thanks in advance
>
> --
> You received this message because you are subscribed to the Google Groups
> "jackson-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
--
You received this message because you are subscribed to the Google Groups
"jackson-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
For more options, visit https://groups.google.com/d/optout.