InvalidDefinitionException:无法构造“javax.xml.bind.JAXBElement”的实例(不存在类似默认构造的创建者)

InvalidDefinitionException:无法构造“javax.xml.bind.JAXBElement”的实例(不存在类似默认构造的创建者),java,xml,jackson,xsd,jaxb,Java,Xml,Jackson,Xsd,Jaxb,我在读取XML文件时遇到问题。我使用多个XSD文件和一个maven插件生成了XML绑定。我在Github上推出了一个问题的最小可重现性示例: 生成xml绑定类的Maven插件: <plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifac

我在读取XML文件时遇到问题。我使用多个XSD文件和一个maven插件生成了XML绑定。我在Github上推出了一个问题的最小可重现性示例:

生成xml绑定类的Maven插件:

            <plugin>
                <groupId>org.jvnet.jaxb2.maven2</groupId>
                <artifactId>maven-jaxb2-plugin</artifactId>
                <version>0.14.0</version>
                <executions>
                    <execution>
                        <id>cobieLiteRc4</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <configuration>
                            <forceRegenerate>true</forceRegenerate>
                            <generateDirectory>${project.build.directory}/generated-sources/cobielite
                            </generateDirectory>
                            <schemaDirectory>${project.basedir}/src/main/resources/cobielite/rc4</schemaDirectory>
                            <schemaIncludes>
                                <inclucde>cobielite.xsd</inclucde>
                            </schemaIncludes>
                            <bindingDirectory>
                                ${project.basedir}/src/main/resources/cobielite/rc4
                            </bindingDirectory>
                            <addCompileSourceRoot>true</addCompileSourceRoot>
                            <strict>false</strict>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

更新

问题是JAXB生成了JAXBElement包装类,在使用XMLMapper类时,这似乎是不可解析的

同样的问题:

现在我想到了两个可能的解决办法:

  • 告诉JAXB不要生成JAXBEElement包装类->这可以通过删除替换组来实现,替换组随后会修改模型,并导致生成的Java类的信息不可用、不完整
  • 修改XMLMapper实例以处理JAXBElement包装器

  • 解决方法

    作为一种解决方法,我更改了如何读取xml文件的实现:

            final XmlMapper xmlMapper = new XmlMapper();
            xmlMapper.registerModule(new JaxbAnnotationModule());
            xmlMapper.setDefaultUseWrapper(true);
            xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
            xmlMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
            xmlMapper.configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true);
            xmlMapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true);
            xmlMapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
    
            try (InputStream is = new FileInputStream(new File("cobieLiteExample.xml"))) {
                final FacilityType facilityType = xmlMapper.readValue(is, new TypeReference<FacilityType>() {
                });
            }
    
    JAXBContext jc = JAXBContext.newInstance("org.buildingsmartalliance.docs.nbims03.cobie.cobielite");
    Unmarshaller u = jc.createUnmarshaller();
    
    final JAXBElement<FacilityType> facilityTypeJAXBElement = (JAXBElement<FacilityType>) u.unmarshal(is);
    final FacilityType facilityType = facilityTypeJAXBElement.getValue();
    
    JAXBContext jc=JAXBContext.newInstance(“org.buildingsmartalliance.docs.nbims03.cobie.cobielite”);
    解组器u=jc.createUnmarshaller();
    最终JAXBElement设备类型JAXBElement=(JAXBElement)u.unmarshal(is);
    final FacilityType FacilityType=facilityTypeJAXBElement.getValue();
    

    任何帮助都将不胜感激

    JAXBContext jc = JAXBContext.newInstance("org.buildingsmartalliance.docs.nbims03.cobie.cobielite");
    Unmarshaller u = jc.createUnmarshaller();
    
    final JAXBElement<FacilityType> facilityTypeJAXBElement = (JAXBElement<FacilityType>) u.unmarshal(is);
    final FacilityType facilityType = facilityTypeJAXBElement.getValue();