2009-10-22 3 views
1

jaxb 생성 클래스를 래핑하는 것에 대한 질문이 있으며 입력 내용을 듣고 싶습니다.내 JAXB 객체 래퍼를 비평합니다.

public class ComplexService{ 

ComplexObject1 object1; 
ComplexObject2 object2; 
... 
ComplexObject10 object10; 

public static class ComplexObject1{ 
//Accessors and mutators on ComplexObject1 
} 

public static class ComplexObject2{ 
//Accessors and mutators on ComplexObject1 
} 

... 

public static class ComplexObject10{ 
//Accessors and mutators on ComplexObject1 
} 

} 

지금은을 만들려면 :

<ComplexService> 
    <ComplexObject1> 
     <Element1></Element1> 
     <Parameter></Parameter> 
    </ComplexObject1> 

    <ComplexObject2> 
     <Element2> </Element2> 
     <Parameter> </Parameter> 
    </ComplexObject2> 

    ... 

    <ComplexObject10> 
     <Element10> </Element10> 
     <Parameter> </Parameter> 
    </ComplexObjec10> 

xjc를 통해 위의 XSD를 실행 한 후 생성 된 클래스 A 비트 다음과 같습니다

내 XSD는 비트처럼 보인다 ComplexService 클래스뿐만 아니라 이러한 CompleObjects를 감싸는 래퍼.

  1. 위의 방법은 클래스를 포장 할 수있는 좋은 방법이 될 것이다 :

    public class WrappedComplexObject1{ 
    
    private final ComplexObject1; 
    
    public WrappedComplexObject1(){ 
    complexObject1 = new ComplexObject1(); 
    } 
    
    //Delegate calls to the underlying ComplexObject1 
    public String getServiceName(){ 
    return complexObject1.getServiceName(); 
    } 
    
    } 
    

    내 질문이 있습니까? 내 목표는 xjc에 의해 만들어진 기본 클래스를 망치지 않는 것이다. 더 나은 api (클래스 이름과 메소드 이름)를 제공합니다.

  2. 또한이 개체의 데이터의 유효성을 검사하려고합니다. 따라서 나는 WrappedComplexObject1을 더 감싸기 위해 데코레이터 패턴을 사용할 생각이다. 이것이 권장 접근 방법일까요?

  3. 마지막으로 xsd에는 "Parameter"요소가 구조적으로 동일합니다 (하나의 값 필드 만 포함). 그러나 xjc가 ComplexService 클래스를 만들 때 모든 ComplexObject에 대해 새 Parameter 클래스가 만들어졌습니다.

"매개 변수"에 대해 하나의 래퍼 클래스를 사용하는 것에 대해 걱정해야합니까, 아니면 단순히 ComplexObject 당 하나의 매개 변수 래퍼 클래스를 만들어야합니까?

모든 제안, 아이디어, 코드 샘플이 가장 유용 할 것입니다.

감사

더 응답이 없었다 볼 수 있습니다, 그래서 내 방법은 "선호"방법입니다 만약 내가 확실치 아니라
+0

저는이 질문에 매우 흥미가 있습니다. 너 어디서 났어? – Martin

+0

답변은 아래와 같습니다. – CaptainHastings

답변

1

. 그러나 이것이 결국 내가 한 것입니다 :

// 정의 된 래퍼 수퍼 클래스. 내가 감 쌌던 모든 수업은 이것에서 내릴 것입니다.

public abstract class WrappedSuperComplexObject{ 

    protected boolean isValid; 
    protected String name; 

    public boolean isValid(){ 
     return isValid; 
    } 

    public String getName(){ 
     return name;  
    } 

} 

// 래퍼 제품 클래스

public class WrappedComplexBondObject extends WrappedSuperComplexObject{ 

    //ComplexObject is an internal object created by JAXB 
    private final JAXBElement<Product> productElement; 

    public WrappedComplexBondObject(JAXBElement<Product> productElement) { 
      this.isValid = true; 
      this.name = ProductEnum.BOND; 
      this.productElement= productElement; 
    } 

    //Delegate all get/set class to the internal object 
    public String getElement1() { 
      return productElement.getElement1(); 
    } 

    public String getParameter1() { 
      return productElement.getParameter1(); 
    } 

    } 

// 그리고 확인하고 특정 제품의 인스턴스를 생성하는 팩토리 클래스가 있습니다.

public WrappedSuperComplexObject createWrappedInstance(JAXBElement<DataDocument> jaxbElement) throws WrappedException{ 

    DataDocument document = jaxbElement.getValue(); 
    WrappedValidationResult result = WrappedValidator.validate(document); 

    if (!result.isValid()){ 
     throw new WrappedException(result.getMessage()); 
    } 

    JAXBElement<Product> productElem = (JAXBElement<Product>) trade.getProduct(); 
    String productName = productElem.getName().getLocalPart().toUpperCase(); 

    WrappedSuperComplexObject product = null; 

    switch(WrappedProductEnum.valueOf(productName)){ 

     case BOND: 
      product = new WrappedComplexBondObject(productElem); 
     break; 

     default: 
      product = new UnsupportedProduct("Product is not Supported."); 
     break; 

    } 

    return product;  
} 

질문 3의 경우 주 기본 xsd에서 "매개 변수"요소를 추출하고 매개 변수 용으로 새 xsd를 만들었습니다. 내 주요 xjc에서 "매개 변수"요소를 참조했다.

희망이 도움이됩니다.

+0

업데이트 해 주셔서 감사합니다! – Martin