让我解释一下我的情况
我有一个Web应用程序,它接受xml请求并做出响应。
我已使用jaxb解析请求,将其转换为我的应用程序dao对象,处理该请求,然后将dao结果转换为jaxb对象并返回。
现在,我必须支持多个版本(可以根据请求提供不同的xml版本,并且我必须以适当的xml响应进行响应)。
我为jaxb对象-> dao对象转换器生成Java文件并反转。
问题在于,在转换为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;
}
}
如果我可能也必须生成jaxb编组和解编代码,也请注意一下?
您只需要将xml对象传递给编组器,并用解组器验证
xsd
,因为您可能已经在这样做了:元帅:
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);