Критика мой JAXB объект оболочки - PullRequest
1 голос
/ 22 октября 2009

У меня есть вопрос об упаковке класса, созданного в jaxb, и я действительно хотел бы услышать ваши комментарии.

Мой xsd выглядит примерно так:

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

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

   ...

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

Класс, созданный после запуска вышеуказанного xsd через xjc, выглядит примерно так:

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
}

}

Теперь я хочу создать обертку вокруг этих объектов CompleObject, а также класса ComplexService.

public class WrappedComplexObject1{

private final ComplexObject1;

public WrappedComplexObject1(){
complexObject1 = new ComplexObject1();
}

//Delegate calls to the underlying ComplexObject1
public String getServiceName(){
return complexObject1.getServiceName();
}

}

Вот мои вопросы:

  1. Будет ли вышеуказанный способ предпочтительным способом обернуть класс? Мои цели - не связываться с базовыми классами, созданными xjc; для обеспечения лучшего имени api (класса, а также имена методов).

  2. Я также хочу проверить данные в этих объектах. Поэтому я думаю об использовании шаблон декоратора для дальнейшей упаковки WrappedComplexObject1. Это рекомендуемый подход?

  3. Наконец, xsd содержит элемент «Параметр», который является структурно одинаковым (только содержит одно поле значения). Однако когда xjc создал класс ComplexService, для каждого ComplexObject был создан новый класс Parameter.

Должен ли я беспокоиться о том, чтобы иметь только один класс-обертку для «Параметра», или мне просто нужно создать один класс-обертку для параметра для ComplexObject.

Любые предложения, идеи, примеры кода будут наиболее полезными.

Спасибо

1 Ответ

1 голос
/ 07 декабря 2009

Ну, как вы видите, ответов не было, поэтому я не уверен, является ли мой путь «предпочтительным». Тем не менее, это то, что я в итоге сделал:

// Определен суперкласс Wrapper. Все классы, которые я завернул, будут происходить из этого.

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 я закончил тем, что извлек элемент «Parameter» из моего основного xsd и создал новый xsd только для Parameter. Затем я ссылался на элемент «Параметр» из моего основного xjc.

Надеюсь, это поможет.

...