2012-10-15 10 views
5

Powiel możliwe:
jaxb xjc mapping to existing domain objectsJAX-B - Jak zmapować elementu schematu do istniejącej klasy Javy

Używam JAX-B do generowania klas Java z schematu XML .

Jest jeden element w moim schemacie, który chciałbym powiązać z klasą Java istniejącą w moim projekcie. Moje powiązanie jest wykonywane w pliku .xjb. Próbowałem kilku podejść, ale nie mogę uzyskać niczego do pracy.

Czy to możliwe? Jeśli tak, w jaki sposób?

Oto przykład mniejszy od mojego problemu:

Moja istniejącej klasy Java:

package com.existing; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlType; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Existing { 
    private String prop; 
    public String getProp() { return prop; } 
    public void setProp(String prop) { this.prop = prop; } 
} 

moim schemacie:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.baloiselife.com/xpression/policy" 
    xmlns="http://www.baloiselife.com/xpression/policy" > 

<xs:element name="root_node"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="some_other_propery" type="xs:string"/> 
     <!-- I want this element to map onto my existing Java class --> 
     <xs:element name="special_element" type="existing_type" minOccurs="0" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

<!-- I want this element to be ignored, and instead my Java class used --> 
<xs:complexType name="existing_type"> 
    <xs:sequence> 
    <xs:element name="prop" type="xs:string" minOccurs="0" /> 
    </xs:sequence> 
</xs:complexType> 

Więc jakieś pomysły co my wiążących powinno być? Próbowałem użyć ustawienia jxb: class, ale nie mogłem go uruchomić. Mój końcowy wynik ma dwa wymagania:

  1. Klasa ExistingType jest nie generowany ze schematu
  2. Klasa Rootnode ma element typu istniejących, który mapuje do mojego istniejącego klasy Javy

Odpowiedz

6

Możesz użyć zewnętrznego pliku powiązania, aby skonfigurować XJC do robienia tego, co chcesz.

binding.xjb

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 

    <jxb:bindings schemaLocation="yourSchema.xsd"> 
     <jxb:bindings node="//xs:complexType[@name='existing_type']"> 
      <jxb:class ref="com.existing.Existing"/> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

XJC połączeń

xjc -d outputDir -b binding.xjb yourSchema.xsd 
+1

Dzięki Blaise. Wygląda na to, że atrybut ref został dodany ze schematem 2.1 jxb, a moje IDE używało starszego ... Więc nie widziałem tej opcji! Teraz wszystko działa świetnie. –

Powiązane problemy