私は、サーバーからjsonオブジェクトを取得してxml形式に変換する必要があるプロジェクトで作業しています。マーシャリングする前にすべてのクラスをJAXBContextに渡す必要があります
現在、現在は問題なく動作していますが、正しい方法で作業していますか?
私はこれらのJavaクラスがバインドされています。
@XmlRootElement
public class Message {
@XmlElement
private String status;
@XmlElement
private String details;
//getters and setters
}
@XmlRootElement
public class Response extends Message {
@XmlElement
private List<Case> cases;
//getters and setters
}
@XmlRootElement
public class Case {
@XmlElement
private id;
@XmlElement
private name;
//gettersand setters
}
これが私の動作クラスでうまくいきました。バインドするすべてのクラスを渡したことに注意してください。
public class StrutsAction {
public execute() {
//initial logic
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class, Message.class, Case.class);
Marshaller marshaller = jaxbContext.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(reponse, sw);
return new ByteArrayInputStream(sw.toString().getBytes("UTF-8"));
}
}
私は、このようにそれを実行しようとしました、そしてそれはまだ動作します:ここで私はちょうどResponse.classに編通過
public class StrutsAction {
public execute() {
//initial logic
JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
Marshaller marshaller = jaxbContext.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(reponse, sw);
return new ByteArrayInputStream(sw.toString().getBytes("UTF-8"));
}
}
さて、私の実際のプロジェクトで、私はと多くのクラスを持っていますJAXBContext.newInstance(class ...)を可能な限り呼び出すと、すべてのクラスを渡す必要はありません。だから誰かが私にこれを行うための最善の方法を教えてくれるでしょう。いつ縛られるべきすべてのクラスを渡すべきですか?私はそれがドキュメント上で何を言うのかを完全に理解していません。だから、
public String execute() {
inputStream = MethodUtil.generateSuccessMsgResponse(ResponseObj, Response.class, Message.class, Case.class, OtherClass.class, AnotherClass.class);
}
:
public static InputStream generateSuccessMsgResponse(Object object, Class<?>...classes) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(classes);
Marshaller marshaller = jaxbContext.createMarshaller();
StringWriter sw = new StringWriter();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(object, sw);
return new ByteArrayInputStream(sw.toString().getBytes("UTF-8"));
} catch (PropertyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
return null;
}
しかし、私はそれを呼び出すたび、私はまだすべてのバインディングクラスに渡す必要があります:
は、私は私のコードのクリーンにするために応答を生成し、このヘルパーメソッドを追加しました私の本当の疑問は、私はこれらすべてのクラスに合格する必要があるということですか?私がResponse.classを渡すだけであれば、まったく同じように動作します。
おかげで、私は私の既存のヘルパーメソッドでより多くのコードスニペットを追加したことがわかり、私はできれば私が本当に混乱しています唯一のものがある。このような何かマーシャリングしようとしているすべてのクラスの代わりにヘルパーメソッドを呼び出すときに、ただ1つのクラス(上記の例ではレスポンスクラス)を渡してください – heisenseiberg
プロダクションで動作する私のコードでは、すべての従属クラスを渡す必要はありませんマーシャラー。 – vssk
すべての従属クラスを通過することなく動作しますしかし、私はそのようなことをするための短所があるかどうかはわかりません – heisenseiberg