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 <legacyofma...@gmail.com> 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 jackson-user+unsubscr...@googlegroups.com.
> To post to this group, send email to jackson-user@googlegroups.com.
> 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 jackson-user+unsubscr...@googlegroups.com.
To post to this group, send email to jackson-user@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to