2009-10-22 62 views
1

我有一个关于包装jaxb创建类的问题,并且很想听听你的输入。评论我的JAXB对象封装器

我的XSD看起来有点像:

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

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

    ... 

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

通过XJC运行上面的XSD后创建的类看起来有点像:

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 
} 

} 

现在我想创建一个封装这些CompleObjects以及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类。

我应该担心只有一个“Parameter”包装类,或者我应该简单地为每个ComplexObject创建一个Parameter包装类。

任何建议,想法,代码示例将是最有帮助的。

感谢

+0

我对这个问题很感兴趣。你有没有得到它的任何地方? – Martin 2009-12-07 00:01:32

+0

答案如下。 – CaptainHastings 2009-12-07 17:30:43

回答

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中提取了“Parameter”元素,并为参数创建了一个新的xsd。然后我引用了我的主xjc中的“Parameter”元素。

希望这会有所帮助。

+0

感谢您的更新! – Martin 2009-12-10 21:20:40