gpt4 book ai didi

java - 支持多个 xsd 版本

转载 作者:行者123 更新时间:2023-11-30 11:41:47 26 4
gpt4 key购买 nike

让我解释一下我的场景我有一个接受 xml 请求和响应的 Web 应用程序。我使用 jaxb 解析请求,将其转换为我的应用程序 dao 对象,处理请求,然后将 dao 结果重新转换为 jaxb 对象并返回。现在我必须支持多个版本(不同的 xml 版本可以作为请求出现,我必须以合适的 xml 响应来响应)。我为 jaxb 对象生成 java 文件 -> dao 对象转换器和反向。问题是,在转换为我的 dao 对象之前,创建了 jaxb 对象,然后在将其传递给我的转换器之前对其进行了验证。我不确定在这里应用什么设计模式。可能是适配器模式。请建议?如果我还必须生成 jaxb 编码和解编码代码,还要说明一下吗?

最佳答案

希望我能很好地理解您的问题。所以你已经拥有:

xml 1 ---> jaxb objects 1 ---> converter 1 ---> entity objects

现在您需要适应新的 xml 格式。

为此,您可以编写一个新转换器来支持新格式:

xml 2 ---> jaxb objects 2 ---> converter 2 ---> entity objects

或者编写一些 xml 适配器来使新的 jaxb 对象适应第一种格式:

xml 2 ---> jaxb objects 2 ---> adapter ---> jaxb objects 1 ---> converter 1 ---> entity objects

我会建议第一种方法:编写一个新的转换器,以便新格式不依赖于第一种格式(以防可能需要淘汰第一种格式)。

转换器将自身与 jaxb 对象混合在一起,作为实体对象的包装器以及用于复杂类型的 @XmlJavaTypeAdapter。一个非常简单的例子:

public class XmlPerson {
private Person person;

public XmlPerson(Person person) {
this.person = person;
}

public XmlPerson() {
this.person = new Person();
}

public Person getPerson() {
}

public String getFirstName() {
return person.getFristname();
}

public void setFirstname(String firstName) {
person.setFirstName(firstName);
}

....

@XmlJavaTypeAdapter(XmlAddressAdapter.class)
public Address getAddress() {
return person.getAddress();
}

public void setAddress(Address address) {
person.setAddress(address);
}
}

@XmlJavaTypeAdapter 本身应该从 Address 适应(转换)为 XmlAddress

public class XmlAddressAdapter extends XmlAdapter<XmlAddress, Address> {
@Override
public Address unmarshal(XmlAddress xmlAddress) throws Exception {
return xmlAddress.getAddress();
}

@Override
public XmlAddress marshal(Address address) throws Exception {
return address != null ? new XmlAddress(address) : null;
}
}

Also throw light if i may have to generate the jaxb marshalling and un-marshalling code too?

您只需将 xml 对象传递给编码器并使用解码器验证 xsd,就像您可能已经在做的那样:

编码(marshal):

   JAXBContext jaxbContext = JAXBContext.newInstance(XmlPerson.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.marshal(xmlPerson, output);

解码:

JAXBContext jaxbContext = JAXBContext.newInstance(targetClass);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

SchemaFactory sf = SchemaFactory.newInstance(
javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(XmlInvoice.class.getResource("/yourXsd.xsd"));
jaxbUnmarshaller.setSchema(schema);

Object unmarshalResult = jaxbUnmarshaller.unmarshal(inputStream);

关于java - 支持多个 xsd 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12119585/

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