jaxb 相关问题

用于XML绑定的Java体系结构是将XML用作域对象的Java标准。它提供了一种将Java类映射到XML表示的简单机制。

升级到SpringBoot 3抛出javax.xml.bind.JAXBException

`嗨, 我正在尝试将我的项目从 2.6.7 apache cxf(4.0.1) 升级到 springboot 3.1.6,但是它在线程“main”java.lang.NoClassDefFoundError: javax/xml...

回答 1 投票 0

使用 JDK 21 构建时 Wsimport 失败

我正在尝试将服务从 Java 8 升级到 JDK 17。我对 Maven 还很陌生。下面是 Maven pom.xml 文件。 com.sun.xml.ws ...

回答 1 投票 0

编组/解组 XML 列表,其中包含与不同特定变量同名的元素

使用 MOXy(或任何其他 XML 框架)是否可以在此 xml 和对象之间执行以下编组和解组: 30 使用 MOXy(或任何其他 XML 框架)是否可以在此 xml 和对象之间执行以下编组和解组: <teacher> <field name="Age">30</field> <field name="Name">Bob</field> <field name="Course">Math</field> </teacher> public class Teacher { Field Age; Field Name; Field Course; } public class Field { String name; String value; } 有一些适用于编组的解决方案(用 @XmlElement(name= "field") 注释所有字段),也有一些适用于解组的解决方案(@XmlPath("field[@name='Age']/text()") . 但是,是否有一种双向工作的解决方案,或者一种可以在这两种格式之间解组和编组 XML 的方法? 使用 JAXB 的 xjc 工具从 XML 模式生成 JAXB 类,结果: xjc -no-header teacher.xsd 老师.java package generated; import java.util.*; import jakarta.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "field" }) @XmlRootElement(name = "teacher") public class Teacher { @XmlElement(required = true) protected List<Field> field; public List<Field> getField() { if (field == null) field = new ArrayList<>(); return this.field; } } Field.java package generated; import jakarta.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "value" }) @XmlRootElement(name = "field") public class Field { @XmlValue protected String value; public String getValue() { return value; } public void setValue(String value) { this.value = value; } @XmlAttribute(name = "name", required = true) protected String name; public String getName() { return name; } public void setName(String value) { this.name = value; } } 从此 XML 模式: 老师.xsd <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" > <xs:element name="teacher"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" ref="field"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="field"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="name" use="required" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:schema>

回答 1 投票 0

带有枚举的 Xsd - 输入枚举类型时出现错误

我正在尝试添加枚举类型,如下所示。它添加了字符串类型,但当 jaxb 将 xsd 转换为 java 类时我需要枚举值。我使用 simpletype 将其转换为字符串但不...

回答 2 投票 0

在 Jersey 中处理重载方法与 Jackson 的“冲突的 Setter 定义”

您好 Stack Overflow 社区, 我在基于泽西岛的应用程序中遇到了 Jackson 的问题,特别是处理“属性的设置器定义冲突”错误相关...

回答 1 投票 0

java 解包 JAXB_FRAGMENT

我有一个从 xsd 生成的对象: @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "myClass", propOrder = { “ID”, “代码” }) 公共类我的类{ ...

回答 1 投票 0

使用 woodstox 和本地 dtd 验证和解析 xml

我看到了多个与使用 woodstox 和 JAXB 解析 xml 相关的问题,以使用 XMLStreamReader 解组并根据模式进行验证。尽管阅读它们并没有帮助。我需要什么...

回答 1 投票 0

org.springframework.beans.factory.BeanCreationException:创建类中定义的名为“marshaller”的bean时出错

我正在尝试在独立应用程序中使用 spring-ws-2.2.0 和 spring-boot-1.1.8 开发 SOAP Web 服务客户端,但出现此错误: org.springframework.beans.factory.BeanCreationException:错误

回答 1 投票 0

使用类似的包装器解组多个 XML

我有多个具有类似包装器的不同 XML。例如: 我有多个具有类似包装器的不同 XML。例如: <?xml version="1.0" encoding="UTF-8"?> <response id="085845"> <class name="vera-pd" version="1.25" revision="1"> <method name="platce-info"> <status>0</status> <error_msg/> ... method content ... </method> </class> </response> 我想根据 . 中的内容或属性“名称”将它们解组为 POJO。这样的事情可能吗?我想避免为每个方法编写不同的 ResponseClass。 XML 不是我的,它们来自不同的系统,所以我无法使用类型或命名空间。 我尝试像这样使用@XmlElements(类MethodXX1和MethodXX2覆盖VeraWSMethod)。它不起作用,因为解组器无法确定类并使用 @XmlElements 中的最后一个。 @XmlRootElement(name = "class") public class VeraWSClass { private String name; private String version; private String revision; private VeraWSMethod method; @XmlAttribute public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlAttribute public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } @XmlAttribute public String getRevision() { return revision; } public void setRevision(String revision) { this.revision = revision; } @XmlElements({ @XmlElement(name = "method", type = MethodXX1.class), @XmlElement(name = "method", type = MethodXX2.class) }) public VeraWSMethod getMethod() { return method; } public void setMethod(VeraWSMethod method) { this.method = method; } } 是的,可以解组包含由具有不同值的给定属性区分的不同内容的 XML 实例。 这里是一个独立的 Maven 演示 project 和 zip,它使用这些 JAXB 功能来提供解决方案: @XmlJavaTypeAdapter(MethodXmlAdapter.class) - 用于指定类以提供自定义 unmarshaller 和 marshaller 方法的 JAXB 注释。 MethodXmlAdapter.class - 在解组 method 元素时从 JAXB 接收 DOM Element。 Element 实例用于将区别名称读取为 DOM 属性。封送时,JAXB 提供要在适配器中封送的 MethodXXN 实例,以返回 DOM Element 表示形式。 解组的关键点是可以通过编程方式访问区分属性,并且可以将 DOM 元素解组为所需的 Java 类型。 Context.mainUnmarshalByName(...) public static Object mainUnmarshalByName(Element element) { Object value = null; String name = element.getAttribute("name"); switch (name) { case "platce-info": value = mainUnmarshal(element, METHODXX1_CLASS); break; case "platce-data": value = mainUnmarshal(element, METHODXX2_CLASS); break; default: value = element; break; } return value; } 编组的关键点是可以使用声明的 QName(带或不带命名空间)将不同的 MethodXXN 实例编组到一个 method 元素。 Context.mainWrapAsMethod(...) @SuppressWarnings({ "rawtypes", "unchecked" }) public static Object mainWrapAsMethod(Object value) { Object wrap = null; if ( value != null ) { if ( isJAXBElement(value) ) value = ((JAXBElement) value).getValue(); if ( METHODXX1_CLASS.equals(value.getClass()) ) wrap = new JAXBElement(METHOD_QNAME, METHODXX1_CLASS, value); else if ( METHODXX2_CLASS.equals(value.getClass()) ) wrap = new JAXBElement(METHOD_QNAME, METHODXX2_CLASS, value); } return wrap; } 实施 示例项目使用 HiSrc HighJAXB Maven 插件和来自 HiSrc BasicJAXB 的 XJC 插件生成 JAXB 类。 XML 模式将 MethodXXN 类型定义为 MethodBase 的子类型,其中包含公共属性和元素。 XJC从platce.xsd生成的类 org └── example └── platce ├── MethodBase.java ├── MethodXX1.java ├── MethodXX2.java ├── ObjectFactory.java ├── Response.java └── VeraWSClass.java platce.xsd 模式定义了 VeraWSClass 类型来保存 any 元素;但是,HiSrc HighJAXB Maven 插件使用 HiSrc BasicJAXB 自定义 XJC 插件和 HiSrc HyperJAXB Annox 注释 XJC 插件,使用单独的配置文件:VeraWSClass.any 添加 @XmlAnyElement 和 @XmlJavaTypeAdapter 注释。 xml. 执行 对于演示,您可以使用以下方式运行测试和/或应用程序: mvn -Ptest clean test mvn -Pexec compile exec:java -Dexec.args="src/test/samples/response01.xml" mvn -Pexec compile exec:java -Dexec.args="src/test/samples/response02.xml" 免责声明:我是分叉的 HiSrc BasicJAXB、HiSrc HighJAXB 和 HiSrc HyperJAXB Annox 项目的维护者。

回答 1 投票 0

jaxb:extensionBindingPrefixes 不适用于 cxf-xjc-plugin?

cxf-xjc-plugin 未按预期工作。 在 maven (java11) 中全新安装后,我遇到以下问题 供应商扩展绑定 (jaxb:extensionBindingPrefixes) 不是 允许在...

回答 1 投票 0

是否可以使用 JAXB 从模式映射到 java.util.Map?

我有一个现有的 XML 模式,其中包含我想使用 JAXB 映射到某种 Java 映射的类型。我的构建过程采用架构并创建 bean。我想定制...

回答 3 投票 0

从 java 对象创建 XML

我正在尝试从 Java 对象创建 XML,但收到错误“在模块路径或类路径上未找到 JAXB-API 的实现”。请帮助我解决该错误。 @请求M...

回答 1 投票 0

当我尝试解组 WebServiceResponse 时出现解组错误

我有来自第 3 方 API 的响应,它给我一个解组 xml 响应的错误,类似于: 我收到来自第 3 方 API 的响应,该响应给我一个解组 xml 响应的错误,类似于: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ns2:webServiceResponse xmlns="http://ws.services.company.com" xmlns:ns2="http://rest.ws.services.company.com"> <ns2:result> <success>true</success> <id>7054986</id> </ns2:result> </ns2:webServiceResponse> 通常我会使用这样的 xml 响应来测试我的 Java 代码,并且获得成功: <webServiceResponse xmlns="http://ws.services.company.com"> <result> <success>true</success> <id>1</id> </result> </webServiceResponse> 在 Java 中,我一直在使用以下 xsd 文件创建相应的 XML 数据类。 CompanyWS.xsd <?xml version="1.0" encoding="UTF-8"?> <xsd:schema elementFormDefault="qualified" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" jxb:version="3.0" targetNamespace="http://ws.services.company.com" xmlns="http://ws.services.company.com" version="1.0" xmlns:ns2="http://ws.services.company.com" xmlns:ws="http://ws.services.company.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:include schemaLocation="CompanyWSTypes.xsd"/> <xsd:element name="someFunctionality"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="ns2:WebServiceRequest"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="someEvent" type="ns2:InteractObject"/> <xsd:element maxOccurs="1" minOccurs="1" name="recipientData" type="ns2:RecipientData"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> <xsd:element name="someFunctionality2"> <xsd:complexType> <xsd:complexContent> <xsd:extension base="ns2:WebServiceRequest"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="customEvent" type="ns2:CustomEvent"/> <xsd:element maxOccurs="1" minOccurs="1" name="recipientData" type="ns2:RecipientData"/> </xsd:sequence> </xsd:extension> </xsd:complexContent> </xsd:complexType> </xsd:element> <xsd:element name="webServiceResponse"> <xsd:complexType> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="result" nillable="true" type="ns2:WebServiceResult"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema> CompanyWSTypes.xsd <?xml version="1.0" encoding="UTF-8"?><xsd:schema elementFormDefault="qualified" xmlns:jxb="https://jakarta.ee/xml/ns/jaxb" jxb:version="3.0" targetNamespace="http://ws.services.company.com" version="1.0" xmlns:ns2="http://ws.services.company.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:complexType name="InteractObject"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="folderName" type="ns2:minLengthString"/> <xsd:element maxOccurs="1" minOccurs="1" name="objectName" type="ns2:minLengthString"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="RecipientData"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="recipient" type="ns2:Recipient"/> <xsd:element maxOccurs="unbounded" minOccurs="0" name="optionalData" nillable="true" type="ns2:OptionalData"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Recipient"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="listName" type="ns2:InteractObject"/> <xsd:element maxOccurs="1" minOccurs="0" name="recipientId" nillable="true" type="xsd:long"/> <xsd:element maxOccurs="1" minOccurs="0" name="customerId" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="mobileNumber" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="emailAddress" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="permissionStatus" nillable="true" type="ns2:PermissionStatus"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="OptionalData"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="1" name="name" type="ns2:minLengthString"/> <xsd:element maxOccurs="1" minOccurs="1" name="value" type="ns2:minLengthString"/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="minLengthString"> <xsd:restriction base="xsd:string"> <xsd:minLength value="1"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="CampaignType"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="TRANSACTIONAL"/> <xsd:enumeration value="PROMOTIONAL"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="PermissionStatus"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="OPTIN"/> <xsd:enumeration value="OPTOUT"/> <xsd:enumeration value="NOT_SPECIFIED"/> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name="PriorityLevel"> <xsd:restriction base="xsd:int"> <xsd:enumeration value="1"/> <xsd:enumeration value="2"/> <xsd:enumeration value="3"/> </xsd:restriction> </xsd:simpleType> <xsd:complexType name="WebServiceRequest"> <xsd:sequence> <xsd:element maxOccurs="unbounded" minOccurs="0" name="additionalData" nillable="true" type="xsd:anyType"/> </xsd:sequence> <xsd:attribute name="transactionId" type="xsd:string"/> <xsd:attribute name="accountId" type="xsd:string"/> <xsd:attribute name="brandId" type="xsd:string"/> <xsd:attribute name="langLocale" type="xsd:string"/> <xsd:attribute default="1" name="priorityLevel" type="ns2:PriorityLevel"/> <xsd:attribute default="TRANSACTIONAL" name="campaignType" type="ns2:CampaignType"/> </xsd:complexType> <xsd:complexType name="CustomEvent"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="0" name="eventName" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="eventId" nillable="true" type="xsd:long"/> <xsd:element maxOccurs="1" minOccurs="0" name="eventStringDataMapping" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="eventDateDataMapping" nillable="true" type="xsd:string"/> <xsd:element maxOccurs="1" minOccurs="0" name="eventNumberDataMapping" nillable="true" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="WebServiceResult"> <xsd:sequence> <xsd:element name="success" type="xsd:boolean"/> <xsd:element minOccurs="0" name="id" nillable="true" type="xsd:long"/> <xsd:element minOccurs="0" name="error" nillable="true" type="ns2:WebServiceError"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="WebServiceError"> <xsd:sequence> <xsd:element maxOccurs="1" minOccurs="0" name="code" nillable="true" type="ns2:ErrorCode"/> <xsd:element maxOccurs="1" minOccurs="0" name="message" nillable="true" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:simpleType name="ErrorCode"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="MISSING_REQUIRED_FIELD"/> <xsd:enumeration value="DATABASE_ERROR"/> <xsd:enumeration value="SERVER_ERROR"/> <xsd:enumeration value="LOGIN_ERROR"/> </xsd:restriction> </xsd:simpleType> </xsd:schema> 我得到的错误: Unable to unmarshal to WebServiceResponse. jakarta.xml.bind.UnmarshalException: unexpected element (uri:"http://rest.ws.services.company.com", local:"webServiceResponse"). Expected elements are <{http://ws.services.company.com}someFunctionality>,<{http://ws.services.company.com}someFunctionality2>,<{http://ws.services.company.com}webServiceResponse> at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:693) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportError(Loader.java:230) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportError(Loader.java:225) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:92) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1102) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:527) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:509) ~[task/:?] at org.glassfish.jaxb.runtime.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137) ~[task/:?] . . . 任何人都可以帮忙解决这个问题吗? 我认为它无法将响应名称空间与 ns2 关联起来,ns2 与 uri 开头关联为 rest。但我无法在 xsd 文件上执行此操作以与 ns2 关联,因为它总是给出错误。 XSD 中的目标命名空间,因此在 Java 生成的代码中是 targetNamespace="http://ws.services.company.com",但您会在 webServiceResponse 命名空间中收到 http://rest.ws.services.company.com。 这就是解组器抱怨没有收到预期元素之一的原因 您的 XSD 是您自己创建的还是由其他人发送的?无论如何,要使其正常工作,您应该根据预期更改 targetNamespace(其中包含 rest 前缀)。

回答 1 投票 0

将我的 jaxb 代码生成器迁移到 jakarta 后,未编组的 xml 有所不同

将 jaxb 依赖项迁移到使用 jakarta 的依赖项(详细信息如下:Java 11 包 javax.xml.bind 不存在)后,我观察到一些奇怪的情况。 我正在使用 jaxb2-maven-plugin,版本...

回答 1 投票 0

使用 JAXB 的动态 XML 元素

所以让我们举一个例子,假设您有这个 XML。 4 让我们举一个例子,假设您有这个 XML。 <?xml version="1.0" encoding="UTF-8"?> <test> <KeyEvents> <num_events>4</num_events> <event_1> <distance>0.044</distance> </event_1> <event_2> <distance>0.055</distance> </event_2> <event_3> <distance>3.778</distance> </event_3> <event_4> <distance>3.822</distance> </event_4> <Summary> <total_distance>7.699</total_distance> </Summary> </KeyEvents> </test> 问题是每个 XML 文件都会不同,并且具有不同数量的 event_[x]。所以本质上可能有 4 个、300 个甚至没有。 这就是模型。 @XmlRootElement(name = "test") public class test { private int numEvents; private Event event; private Summary summary; public static class Event { private double distance; @XmlElement(name = "distance") public double getDistance() { return distance; } } public static class Summary { private double totalDistance; @XmlElement(name = "total_distance") public double getTotalDistance() { return totalDistance; } } } 最终目标是迭代所有“事件”并获取每个事件的每个距离,然后将它们打印到控制台(总会有一个摘要)。 我尝试过将事件存储为地图。示例: private Map<String, Event> events; 但我似乎无法解压和迭代所有事件。有什么帮助吗?珍惜时间。 尝试 powershell 脚本 using assembly System.Xml.Linq $filename = "c:\temp\test.xml" $doc = [System.Xml.Linq.XDocument]::Load($filename) $keyEvents = $doc.Descendants("KeyEvents")[0] $events = [System.Linq.Enumerable]::Where($keyEvents.Elements(), [Func[object,bool]]{ param($x) $x[0].Name.LocalName.StartsWith('event')}) $table = [System.Collections.ArrayList]::new() foreach($event in $events) { $newRow = [pscustomobject]@{ Name = $event.Name.LocalName Distance = $Event.Element('distance').Value } $table.Add($newRow) | Out-Null } $summary = $keyEvents.Element('Summary').Value $newRow = [pscustomobject]@{ Name = 'Summary' Distance = $summary } $table.Add($newRow) | Out-Null $table 结果 Name Distance ---- -------- event_1 0.044 event_2 0.055 event_3 3.778 event_4 3.822 Summary 7.699

回答 1 投票 0

从 Java8 迁移到 Java11 后出现 JAXB SAXParseException

我正在将 Spring Boot 2.7.0 项目从 Java 8 升级到 Java 11。 该项目使用 maven-jaxb2-plugin 从 wsdl 文件生成类。 这是配置 组织。

回答 1 投票 0

演示 JAXB 解组不会加载 XSD 模式

与此问题相关,给出以下名为 customer.xsd 的架构: 与这个问题相关,给出以下名为customer.xsd的模式: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="stringMaxSize5"> <xs:restriction base="xs:string"> <xs:maxLength value="5"/> </xs:restriction> </xs:simpleType> <xs:element name="customer"> <xs:complexType> <xs:sequence> <xs:element name="name" type="stringMaxSize5"/> <xs:element ref="phone-number" maxOccurs="2"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="phone-number"> <xs:complexType> <xs:sequence/> </xs:complexType> </xs:element> </xs:schema> 以下 XML 文档称为 input.xml: <customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./customer.xsd"> <name>Jane Doe</name> <phone-number/> <phone-number/> <phone-number/> </customer> 以及以下解组代码: import java.io.File; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlRootElement; public class Unmarshal { @XmlRootElement(name = "customer") public static class Customer { public String name; @XmlElement(name="phone-number") public List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>(); } public static class PhoneNumber {} public static void main(String[] args) throws Exception { JAXBContext jc = JAXBContext.newInstance(Customer.class); Unmarshaller unmarshaller = jc.createUnmarshaller(); unmarshaller.setSchema(null); Customer customer = (Customer) unmarshaller.unmarshal(new File("input.xml")); System.out.println(customer.name); } } Java 代码能够将 XML 输入文档反序列化为 Customer 的实例,即使此 XML 文档产生 2 个验证错误(由外部编辑器指示): cvc-maxLength-valid: Value 'Jane Doe' with length = '8' is not facet-valid with respect to maxLength '5' for type 'stringMaxSize5'.xml(cvc-maxLength-valid) cvc-type.3.1.3: The value 'Jane Doe' of element 'name' is not valid.xml(cvc-type.3.1.3) 和 cvc-complex-type.2.4.f: 'phone-number' can occur a maximum of '2' times in the current sequence. This limit was exceeded. No child element is expected at this point.xml(cvc-complex-type.2.4.f) 这意味着 JAXB 在解组期间没有验证给定的 XML 输入,但是: 鉴于 unmarshaller.setSchema(null); 设置为 DISABLE 模式验证,有没有办法证明在解组时 JVM 未访问 customer.xsd 文件的内容? 换句话说,有没有办法不盲目相信 JVM 不会加载 XSD 引用,即使模式验证显式设置为 null? 更新1: 目的是找出 XML 文档内的 XSD 架构引用有多大可能成为安全攻击媒介,如下所述: https://owasp.org/www-community/vulnerability/XML_External_Entity_(XXE)_Processing https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html 谢谢。 我并不真正理解检查这一点的必要性,但这里有一个简单的用例,应该证明在解组 XML 时 XSD 文件不会被 JVM 加载: 通过任何您想要的插件从 XSD 创建 Java 类,或者像这里一样,手动创建它。将其打包在 jar 文件中,其中不含 XSD(仅限 Java 类) 在另一个 Java 程序中从 XML 编写解组代码,该代码依赖于第一个 JAR,并在类路径中没有任何 XSD 的情况下运行它 ==> 即使不知道 XSD 架构,您的代码仍然可以工作 您还可以查看 Java 代码本身: 实现 com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl 接口的 Unmarshaller 的默认 schema 属性为 null(因此将其设置为 null 在上面的代码中是无操作的) 您的代码不引用您创建 Java XML-annotated-POJO 的 XSD 本身:JVM 无法猜测您是根据外部模式编写的代码。 您还可以在调试模式下运行程序,并看到 XSD 不会被加载(同样,您的 Java 代码中没有引用:您甚至可以删除它,这不会产生任何影响)。 不过,我希望我已经回答了你的问题。

回答 1 投票 0

jaxb2 从主 xsd 生成的类和通用 xsd 具有不同的命名空间

我有 2 个 xsd 模式,我使用 maven-jaxb2-plugin 从中生成一个类消息。主要的 xsd 是 message.xsd,它导入 common.xsd,其中包含一些常见类型。然而两者都有不同...

回答 1 投票 0

如何对具有包名称的元素进行 JaxB XML 解组/编组?

我得到了以下 XML,其中元素名称与其包名称一起出现。如何使用 JaxB 编组/解组给定的 XML? KT12356 我得到了以下 XML,其中元素名称与其包名称一起出现。如何使用 JaxB 编组/解组给定的 XML? <com.jaraws.api.Vehicle> <number>KT12356</number> <engine>DIESEL<engine> </com.jaraws.api.Vehicle> Java 类写成: package com.jaraws.api; @XmlRootElement public class Vehicle{ private String number; private String engine; // Getters Setter for number and engine attributes @XmlElement public String getNumber(){ return number; } public void setNumber(){ this.number=number; } @XmlElement public String getEngine(){ return engine; } public void setEngine(){ this.engine=engine; } } 它是否可以实现,或者我没有在正确的事情上做某事。我只想以给定的格式编组/解组 xml。 按照 Thomas 在评论中的建议,只需将 name 属性添加到 @XmlRootElement 注释到您期望的名称即可: @XmlRootElement(name = "com.jaraws.api.Vehicle") public class Vehicle { // class definition ... } 您不能执行以下操作: @XmlRootElement(name = Vehicle.class.getName()) 如果您尝试这样做,您将收到以下错误:The value for annotation attribute XmlRootElement.name must be a constant expression 默认情况下,根据javadoc,如果未设置名称,则它是从类名派生的: public @interface XmlRootElement { // some stuff /** * local name of the XML element. * <p> * If the value is "##default", then the name is derived from the * class name. * */ String name() default "##default"; } 不指定名称元素将导致以下名称vehicle(有关更多信息,请参阅org.glassfish.jaxb.runtime.v2.model.impl.TypeInfoImpl#parseElementName方法)

回答 1 投票 0

为什么 JAXB 2 RI 的 XJC 简单模式会更改集合名称?

JAXB简单绑定模式将集合名称修改为其复数 “版本”,例如“附加数据”变为“附加数据”。有什么解决方案可以改变这种行为吗?我需要一个 Java f...

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.