如何防止 JAXB 在编组期间写入未使用的名称空间

2022-09-01 19:35:38

在使用 JAXB 对对象进行封送处理期间,是否有人能够除去未使用的命名空间?以下是所请求功能的链接:https://github.com/javaee/jaxb-v2/issues/103(请参阅说明)

是否有用于为此配置 JAXB 的属性?这个问题在MOXy中是否已修复?

我目前正在遍历需要编组的对象,并提取所有需要绑定到 .然后我创建一个新的Class[] classesToBeBoundJAXBContext.newInstance(classesToBeBound)

未使用的命名空间现在不包括在 XML 中。

我知道即使对于未使用的命名空间,xml验证也是有效的,但对我来说,这是框架应该处理的事情。

下面的链接 https://blogs.oracle.com/enterprisetechtips/entry/customizing_jaxb 提到了各种固定的(参见文本中间的某个地方),但是当试图在这些链接中找到解决方案时,要么链接断开,要么没有人真正解决它。

欢迎任何意见。

(编辑)纯文本:

鉴于

a new instance of JAXBContext and add 2 classes with each a separate namespace. 

什么时候

marshalling a class that has these 2 classes as a property but only 1 of them is not null 

然后

I expect only the namespace of the property that is not null to be visible in the XML. 

但实际情况是

that both namespaces are in the xml. 

所以我的问题是,如何删除或告诉 JAXB 不要编写未使用的命名空间?

把它放在java代码中:GIVEN

public class Foo{
  private Bar bar; //namespace something2
  private User user; //namespace user
}

什么时候

JAXBContext c = JAXBContext.newInstance(Foo.class, Bar.class, User.class);
...
Foo foo = new Foo();
foo.setBar(null);
foo.setUser(new User("Bob"));
marshaller.umarshal(foo);

然后我希望xml是

<foo xmlns="something1"  xmlns:user="user">
  <user:name>Bob</user:name>
</foo>

但实际是(注意 something2 命名空间)

<foo xmlns="something1" xmlns:user="user" xmlns:bar="something2">
  <user:name>Bob</user:name>
</foo>

当然,这是一个简化的示例,我们对一种类型的规范有大约30个不同的命名空间。


答案 1

据我所知,这在JAXB中确实是不可能的 - 实际上是一个众所周知的问题。正如您所注意到的,生成的命名空间列表是在 JAXBContext 中注册的命名空间,而不是在编组时有效使用的命名空间:-(

过去,我使用了与您相同的解决方法(标识各种使用的类并将JAXBContext缩小到这组有限的类)。

另一个典型的解决方法是两步处理:首先使用 JAXB 进行编组,然后进行 XSLT 转换以摆脱“污染”命名空间。


答案 2

这可能是不可能的,因为在创建根标记时,有关哪些对象为 null v/s 而不是 null 的信息可能不可用,因此此对象层次结构的封送处理可能发生。任何提前获取此信息的尝试也可能具有与之相关的副作用,因为调用了相应的访问器方法。因此,JAXB 将静态地使用来自 JAXBContext 的信息来填充此信息。


推荐