gpt4 book ai didi

java - JAXB 使用新的 JAR 添加带注释的类

转载 作者:行者123 更新时间:2023-11-30 10:27:52 25 4
gpt4 key购买 nike

有以下情况:具有 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 实例。

提前感谢您的想法。

最佳答案

更新:

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

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

然后我在框架中创建了一个实现此接口(interface)的类,并列出了我从框架端需要的所有类。扩展也是如此。在 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;
}
}

关于java - JAXB 使用新的 JAR 添加带注释的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45061522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com