当前位置: 首页 > 知识库问答 >
问题:

如何定制和覆盖jaxb绑定

班承恩
2023-03-14

我正在使用来自第三方系统的一组DTD。我们的目标是将XML请求(符合这些DTD的请求映射到java中,然后将XML响应发送回系统)。

DTD是一成不变的(我无法控制更改它们)。

因此,为了进行映射,我使用XMLSpy将dtd转换为XML Schemas (xsd ),然后使用XJC编译器创建Jaxb绑定类。我用的是Java 7。

问题是,DTD 实际上没有命名空间。我有20个不同的DTD。10 表示请求,10 表示响应。当我生成架构时,我必须进行一对一映射。并创建了相同的 10 个请求 XSD 和 10 个响应 XSD。

现在,jaxb xjc 编译器生成了绑定类。但它们远非实际用途。没有继承'cus这些架构彼此不相关(尽管它们似乎具有相似的内容 - 请求类型和响应类型)。

如果有一种方法可以自定义 jaxb 绑定以覆盖默认绑定并创建更合理的绑定,有人可以帮助我吗?

例如,考虑这个简单的案例:

DTD:

<!ELEMENT FromDate (#PCDATA)>
<!ATTLIST FromDate
    year CDATA #REQUIRED
    month CDATA #REQUIRED
    day CDATA #REQUIRED
>

我使用 XMLSpy 生成的架构:

<xs:element name="FromDate">
    <xs:complexType mixed="true">
        <xs:attribute name="year" use="required"/>
        <xs:attribute name="month" use="required"/>
        <xs:attribute name="day" use="required"/>
    </xs:complexType>
</xs:element>

从 XJC 编译器 (java 1.7) 生成的绑定类:

public class FromDate {

    @XmlValue
    protected String content;
    @XmlAttribute(name = "year", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected String year;
    @XmlAttribute(name = "month", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected String month;
    @XmlAttribute(name = "day", required = true)
    @XmlSchemaType(name = "anySimpleType")
    protected String day;
    ...
    ...

如果你看看 fromDate 最终是如何演变的,那么仅仅从这个请求中获取日期就没有任何意义了,我需要做

setMyDate(request.getFromDate().getMonth() + request.getFromDate().getDay() + request.getFromDate().getYear());

这显然是没有道理的。另外,类型很远。

如何自定义/覆盖 jaxb 绑定来实现这两件事:1. 继承(某种抽象以减少冗余) 2.适当的类型

请帮帮忙。

共有1个答案

郑胡媚
2023-03-14

天啊,有人试图在2014年编译DTD。:)

给你几个链接:

  • https://jaxb.java.net/guide/Compiling_DTD.html
  • http://xml.coverpages.org/jaxb0530spec.pdf - 有关自定义语法,请参见 §6
  • https://svn.java.net/svn/ogc~svn/ogc-schemas/trunk/wms/1.1.0/ - 编译 DTD 的 Maven 项目

作为另一种方法,我建议将dtd转换成模式并处理模式。从长远来看会更好。DTD支持非常有限

 类似资料:
  • 问题内容: 昨天我接受了两个小时的技术电话面试(我通过了,woohoo!),但是我完全想出了以下有关Java动态绑定的问题。令人困惑的是,几年前我曾当过助教时曾向大学生教授这一概念,所以我给他们提供错误信息的前景有点令人不安… 这是给我的问题: 我断言输出应该是覆盖法中的两个单独的打印语句:和。后一种情况足够明显,而在前一种情况下,即使t1具有Object类型的引用,也将其实例化为Test类型,因

  • 我有几个测试用例,有一个测试用例我想测试通知不可用。我使用了一个单独的将通知服务实例注入(覆盖)为,而不是通常的 它不起作用,因为 依赖于 Play 在此测试的启动生命周期中注入的其他模块。如何加载这些 Play 默认模块,以便 适用于此测试用例?有没有更好的方法可以做到这一点?谢谢

  • 和子级POM: 在子pom上运行'mvn clean install'将运行编译器插件的两个执行,并且只运行antrun插件的第一个执行,尽管每个插件的第一个执行都绑定到一个阶段。 现在将pluginManagement移动到子POM:

  • 问题内容: 当我对运行xjc时,出现很多错误: ....等等。 我已经尝试使用docbook版本4.5和版本5.0,但是结果相同。 任何指针都会被忽略。谢谢。 问题答案: 您可以将以下绑定文件与DocBook版本5 XML Schema一起使用: 绑定文件 包含绑定的命令行为:

  • 问题内容: 我有一个Json响应,如下所示: 我不知道参数的名称和数量。因此,我需要并且想要将所有这些参数绑定到由<“ paramX”,“ valueX”>元组组成的java.util.Map字段。为此,我尝试了以下代码,但“ parametersMap”字段返回null。 如何使用JAXB批注实现这种绑定? 提前致谢。 问题答案: 基本上,您需要一个xml适配器。您可以摆弄KeyValue类上的

  • 当我试图理解基于版本的乐观锁定如何防止“最后提交获胜”问题和适当的覆盖时,我遇到了困难。 为了使问题更具体,让我们考虑以下使用 JDBC 的伪代码: 这里,如果其他事务会在更新和提交之间提交其更改呢?如果事务是并发的,那么第一个事务所做的更新尚未提交,因此第二个事务不可见(具有适当的隔离级别),因此第一个事务提交将覆盖第二个交易的更改,而不会出现任何通知或错误。 乐观锁定只是降低了问题发生的概率,