gpt4 book ai didi

java - JAXB 和具有外部自定义绑定(bind)的继承

转载 作者:行者123 更新时间:2023-12-01 15:09:42 27 4
gpt4 key购买 nike

我目前正在尝试为 Spring LDAP Filters 建模在我的 XML 架构中。这涉及到多态类型,可以任意嵌套:

<andFilter>
<notFilter>
<equalsFilter name="mail" value="asfd@example.com" />
</notFilter>
<likeFilter name="mail" value="asdf*" />
</andFilter>

这就是我在我的 xsd 中定义上述过滤器的方式(我实际上定义了一些中间抽象类型,但为简单起见将它们排除在外):

<xsd:complexType name="baseFilterType" abstract="true" />
<xsd:element name="filter" type="tns:baseFilterType" />

<xsd:complexType name="andFilterType">
<xsd:sequence>
<xsd:element ref="tns:filter" minOccurs="1" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="andFilter" type="tns:andFilterType" substitutionGroup="tns:filter" />

<xsd:complexType name="notFilterType">
<xsd:sequence>
<xsd:element ref="tns:filter" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="notFilter" type="tns:notFilterType" substitutionGroup="tns:filter" />

<xsd:complexType name="likeFilterType">
<xsd:sequence>
<xsd:element ref="tns:attributeName" />
<xsd:element ref="tns:value" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="likeFilter" type="tns:likeFilterType" substitutionGroup="tns:filter" />

<xsd:complexType name="equalsFilterType">
<xsd:sequence>
<xsd:element ref="tns:attributeName" />
<xsd:element ref="tns:value" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="equalsFilter" type="tns:equalsFilterType" substitutionGroup="tns:filter" />

我已经用一些自定义行为扩展了每个过滤器类(以实现访问者模式),但我不知道如何让 JAXB 绑定(bind)到那些而不是 JAXBElement<? extends BaseFilterType>在整个生成的类中使用。

JAXB 模型类是在构建时生成的,因此我不能直接修改它们 -- 我必须使用外部自定义绑定(bind)进行任何自定义。我试过 implClassbaseClass定制,但一直无法弄清楚如何去做。

有人能帮忙吗?

编辑:我正在使用 Spring 的 Jaxb2MarshallercontextPaths设置编码和解码。我预计这会利用 ObjectFactory用于对象实例化,但事实并非如此。

编辑 2: 过滤器元素由顶级元素以及彼此引用,例如:

<xsd:element name="GetAttributesRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="filter:filter" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>

因此,GetAttributesRequest对象将被标记为 @XmlRootElement而过滤器类本身不会。然而,即使是顶级GetAttributesRequest ObjectFactory 未实例化对象...

最佳答案

编辑:

问题作者使用的解决方案:

I ended up using JAXB binding customizations to make the ObjectFactory produce instances of my classes, and then set the com.sun.xml.internal.bind.ObjectFactory (note the internal) unmarshaller property on Spring's Jaxb2Marshaller to force it to use the factory.


原始答案:

是的,可以将行为添加到生成的类中。你想看看 the related documentation

这是文档中的一个简单示例:

JAXB 生成的代码

package org.acme.foo;

@XmlRootElement
class Person {
private String name;

public String getName() { return name; }
public void setName(String) { this.name=name; }
}

@XmlRegistry
class ObjectFactory {
Person createPerson() { ... }
}

扩展类

包 org.acme.foo.impl;

class PersonEx extends Person {
@Override
public void setName(String name) {
if(name.length()<3) throw new IllegalArgumentException();
super.setName(name);
}
}

@XmlRegistry
class ObjectFactoryEx extends ObjectFactory {
@Override
Person createPerson() {
return new PersonEx();
}
}

解码示例

Unmarshaller u = context.createUnmarshaller();
u.setProperty("com.sun.xml.bind.ObjectFactory",new ObjectFactoryEx());
PersonEx p = (PersonEx)u.unmarshal(new StringReader("<person />"));

更多信息 here

关于java - JAXB 和具有外部自定义绑定(bind)的继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14341060/

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