2013-01-19 4 views
3

Jaxb를 사용하여 Java 클래스를 생성하고 있습니다. 당신이 볼 수 있듯이, 나는 자동차을 하나 개의 요소라고 한Jaxb가 생성 한 ObjectFactory를 사용하는 방법?

<xs:complexType name="AutomobileType" abstract="true"> 
    <xs:sequence> 
     <xs:element name="Color" type="core:ColorName"/> 
     <xs:element name="Weight" type="core:PoundsWeightType"/> 
     <xs:element name="Fuel" type="Fuel"/> 
     <xs:element name="NumDoors" type="xs:nonNegativeInteger"/> 
     <xs:element name="NumCylinders"> 
      <xs:simpleType> 
       <xs:restriction base="xs:int"> 
        <xs:minInclusive value="1"/> 
        <xs:maxInclusive value="12"/> 
       </xs:restriction> 
      </xs:simpleType> 
     </xs:element> 
    </xs:sequence> 
</xs:complexType>  
<xs:element name="Automobile" type="AutomobileType"/> 

: 내 스키마 정의 다음과 같은 요소를 가지고있다.

JAXB 클래스와 내가 자동차의 인스턴스를 생성하는 데 사용 ObjectFactory를을 만듭니다.

public JAXBElement<AutomobileType> createAutomobile(AutomobileType value) 

가 왜 createAutomobile 방법은 인수가 않습니다 다음과 같이 나를 자동차의 인스턴스를 만들 수있는 방법이다 배플 것은 무엇입니까? 이 방법을 사용하려면 어떻게해야합니까?

ObjectFactory objectFactory = new ObjectFactory(); 
objectFactory.createAutomobile(new Automobile()); 

을하지만 자동차 클래스는 추상적이기 때문에이 컴파일되지 않으므로 내가 인스턴스를 만들 수 없습니다 :

나는 다음 시도했다.

+0

Automobile 클래스를 Abstract가 아닌 것으로 변경했으며 모든 것이 이제는 정상적으로 작동합니다. 그러나 Automobile의 인스턴스를 마샬링하려고하면 다음과 같은 오류가 발생합니다. "com.cookmv.dealership.vehicles.schemas.automobile.AutomobileType"형식을 마샬링 할 수 없습니다. 요소가 @XmlRootElement 어노테이션이 없기 때문에 –

답변

2

다른 방법이있다 : JAXB에서

public AutomobileType createAutomobileType(); 

의 XSD : complexType에 "AutomobileType는"구조는 같은 이름의 클래스를 매핑합니다. XML 스키마 유형과 동일한 데이터 구조를 의미합니다.

JAXBElement <>은 자바 객체와 요소 이름 및 네임 스페이스를 연결하는 (매개 변수가있는) 래퍼 유형이므로, 해당 생성자가 요소 네임 스페이스와 함께 생성자에서 매개 변수로 AutomobileType 객체를 사용하는 이유는 요소 이름. 생성 된 ObjectFactory "createAutomobile (..)"은 XML 스키마에서 네임 스페이스와 요소 이름을 하드 코딩하여 해당 생성자를 래핑하는 편리한 방법 일뿐입니다. 이 이분법은 모든 정직 처음은 아니지만

, 당신은 다른 이름

그들은 구조적으로 상응하는 것에 의해 다른 요소를 가질 수 있다고 생각하지만, 요소 이름은 다를 수있다. 또 다른 ObjectFactory 메소드 인 "createMotorcycle (...)"이 있습니다.

xml 요소의 내용을 작성하기 위해 이름이 지정되지 않은 automobileType 개체를 만든 다음 JAXB에 정확히 표현되어야하는 XML 요소를 알릴 수 있습니다.

주제에 대한 JAXB 문서를 읽는 것이 좋습니다.

+0

My ObjectFactory에는 오직 하나의 메소드 만 있습니다. * 인수 없음 * 메소드 createAutomobileType()이 없습니다. –

+2

이는 complexType에 대해 abstract = "true"와 관련이있을 수 있습니다. 거짓으로 설정하면 내기를 할 수 있습니다. 특정 하위 유형을 정의 했습니까?그렇다면 ObjectFactory에 해당 create 메소드가 있고 JAXB 유형은 추상 AutomobileType 클래스의 하위 유형이기도합니다. 즉, 인스턴스를 createAutomobile (AutomobileType) 메소드에 전달할 수 있습니다. JAXB는 두 구조의 의미를 매우 단단히 매핑합니다. –

+0

그게 다야! 감사! –