【问题标题】:JAXB adding annotated classes with new JARJAXB 使用新 JAR 添加带注释的类
【发布时间】:2017-07-12 15:09:56
【问题描述】:

有以下情况: 具有 List 字段的类,例如:

@XMLType
@XMLAccessType(XMLAccessorType.FIELD) 
@XMLRootElement(name = "container")
public class ListContainer {
   @XMLElementWrapper(name="elements")
   private List<Element> elements = new ArrayList<>();

....
}

Element 类是带有 @XMLRootElement 注释的抽象 JAXB 注释类,例如:

@XMLType
@XMLRootElemenent
public abstract class Element {
....
}

这些类定义了某种框架,用户可以在自己的 JAR 包中添加自己的 Element 类实现。我想要实现的是,在解组之后,我将在类 ListContainer 类实例的实例的元素字段中拥有这些实例作为框架的扩展。例如,假设在其他一些 ext1.jar 中有一个类 DummyElement,它位于类路径中,如下所示:

@XMLType
@XMLRootElement(name = "dummy")
public class DummyElement extends Element {
   ....
}

在 ext2.jar 中,我将拥有 EasyElement,例如:

@XMLType
@XMLRootElement(name = "easy")
public class EasyElement extends Element {
...
}

在 xml 中我会有类似的地方:

<container>
    <elements>
        <dummy>....</dummy>
        <easy>...</easy>
        <easy>....</easy>
        <dummy>...</dummy>
    </elements>
</container>

预期结果应该是,ListContainer 类的未编组实例将在元素字段中有 2 个 DummyElement 实例和 2 个 EasyElement 实例。

到目前为止,如果我让 ListContainer 类像这样注释 - 我将在列表中没有任何内容。如果我使用 @XMLAnyElement(lax=true) 进行注释,那么我将拥有 ElementNSImpl 实例。

提前感谢您的想法。

【问题讨论】:

    标签: java xml jaxb annotations


    【解决方案1】:

    更新:

    解决方案是控制 JAXBContext 的创建。我创建了服务接口,它为我提供了上下文所需的类列表,例如:

    public interface XMLContextProvider {
        Set<Class> getJAXBContextClasses();
    }
    

    然后我在框架中创建了一个实现此接口的类,并列出了我在框架方面需要的所有类。扩展也是如此。在 META-INF/services 中注册的类 - 请参阅 ServiceLoader。然后我创建了一个实用程序类,它利用 ServiceLoader 来查找所有提供程序,并使用从所有提供程序收集的所有类的列表创建 JAXBContext。在这种情况下,可以进行 Marshal 和 Unmarshal。此外,当我使用 JAX-RS 时,我为 JAXBContext 创建了一个解析器:

    @Provider
    public class XMLContextResolver implements ContextResolver<JAXBContext> {
        private JAXBContext ctx;
    
        public XMLContextResolver() {
            ctx = <here goes call to utility class>
        }
    
        @Override
        public JAXBContext getContext(Class<?> type) {
            if (this.classes.contains(type)) {
                return this.ctx;
            }
            return null;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      相关资源
      最近更新 更多