Thanks for suggestion, point 2) solve problem for me! I've made with my test case an example repo here: https://github.com/albertotn/Jackson-dataformat-xml-test
Il giorno sabato 7 aprile 2018 00:09:01 UTC+2, Tatu Saloranta ha scritto: > > 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] > <javascript:>> 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] <javascript:>. > > To post to this group, send email to [email protected] > <javascript:>. > > 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.
