2014-03-31 54 views
1

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

DTDs是用石头写的(我没有任何控制改变它们)。

因此,为了映射,我使用XMLSpy将DTD转换为XML Schemas(xsd),然后使用XJC编译器创建Jaxb绑定类。我正在使用Java 7.

问题是,DTD没有真正的名称空间..我有20个不同的DTD .. 10个用于请求,10个用于响应。当我生成模式时,我必须做一对一的映射..并创建了相同的10个请求XSD和10个响应XSD。

现在,jaxb xjc编译器生成绑定类..但它们远没有实际用途。没有继承关系,因为这些模式不相互关联(虽然它们似乎有相似的内容 - 请求类型和响应类型)。

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

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

DTD:

<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:我生成使用XMLSpy的

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

架构):

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最终如何演变,它没有任何意义“CUS只是从这个请求获取日期,我需要做的

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

这显然是没有意义的。另外,类型是远离的。

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

请帮助。

回答