有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

有人能在使用JAXB封送对象期间删除未使用的名称空间吗?以下是请求功能的链接:https://github.com/javaee/jaxb-v2/issues/103(请参见说明)

是否有用于为此配置JAXB的属性? 这在莫西修好了吗

我目前正在遍历需要封送的对象,并提取需要绑定到Class[] classesToBeBound中的所有类。 然后我创建一个新的JAXBContext.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代码中: 给定

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个不同的名称空间


共 (2) 个答案

  1. # 1 楼答案

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

    在过去,我使用了与您相同的解决方法(识别各种使用的类,并将JAXBContext缩小到这个有限的类集合)

    另一个典型的解决方法是两步处理:首先使用JAXB进行编组,然后进行XSLT转换,以消除我们所说的“污染”名称空间

  2. # 2 楼答案

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