私がしたいこと
いくつかの異なる Java オブジェクトを XML にエクスポートしたいと考えています。コードの重複を最小限に抑えるために、次のアプローチを採用しました。
標準の空の DOM ドキュメントとトランスフォーマー ファクトリ パーツの作成を実装する抽象クラスを作成しました。
次に、DOM ドキュメントを特定のオブジェクト データで埋めるための抽象メソッドを追加しました。次に、抽象クラスを拡張し、その特定のオブジェクトの抽象メソッドを実装する CustomerExporter クラスを作成しました。
私はそれを働かせました。
私の質問
さまざまな Java オブジェクトに対応できるように抽象メソッドを作成するにはどうすればよいですか?
問題
オブジェクトは異なるタイプであるため、属性は常に同じではありません。したがって、インターフェイスは機能しません (または機能しますか?)。
コード
顧客クラス
package org.flexdataexoporter.dao;
public class Customer{
private int customerID;
private String firstname;
private String lastname;
private int telnumber;
public Customer(int customerID, String firstname, String lastname, int telnumber){
this.customerID = customerID;
this.firstname = firstname;
this.lastname = lastname;
this.telnumber = telnumber;
}
public int getCustomerID(){
return customerID;
}
public String getFirstName(){
return firstname;
}
public String getLastName(){
return lastname;
}
public int getTelNumber(){
return telnumber;
}
public void setCustomerID(int customerID) {
this.customerID = customerID;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public void setTelnumber(int telnumber) {
this.telnumber = telnumber;
}
}
顧客クラス
package org.flexdataexoporter.dao;
import java.util.ArrayList;
public class Customers extends ArrayList<Customer> {
private static final long serialVersionUID = 1L;
public Customers(){ };
}
抽象エクスポーター クラス
package org.flexdataexporter.export;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.flexdataexoporter.dao.Customers;
import org.w3c.dom.Document;
public abstract class XMLExporter {
public void generateXML(Customers customers) throws ParserConfigurationException, TransformerException{
Document doc = createDomDoc();
fillXML(doc, customers);
}
protected Document createDomDoc() throws ParserConfigurationException{
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
return doc;
}
public abstract void fillXML(Document doc, Customers customers) throws TransformerException;
protected void writeDoc(Document doc) throws TransformerException{
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);
}
}
特定の輸出クラス
package org.flexdataexporter.export;
import javax.xml.transform.TransformerException;
import org.flexdataexoporter.dao.Customer;
import org.flexdataexoporter.dao.Customers;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
public class CustomerExporter extends XMLExporter {
public CustomerExporter(){ }
@Override
public void fillXML(Document doc, Customers customers) throws TransformerException {
Element rootElement = doc.createElement("customers");
doc.appendChild(rootElement);
for(Customer c : customers){
Element customer = doc.createElement("customer");
rootElement.appendChild(customer);
customer.setAttribute("id", Integer.toString(c.getCustomerID()));
Element name = doc.createElement("firstname");
name.appendChild(doc.createTextNode(c.getFirstName()));
customer.appendChild(name);
Element lastname = doc.createElement("lastname");
lastname.appendChild(doc.createTextNode(c.getLastName()));
customer.appendChild(lastname);
Element phone = doc.createElement("phone");
phone.appendChild(doc.createTextNode(Integer.toString(c.getTelNumber())));
customer.appendChild(phone);
super.writeDoc(doc);
}
}
}
誰かが解決策を手伝ってくれることを願っています。