2016-10-06 3 views
1

私は、サーバーから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を渡すだけであれば、まったく同じように動作します。

答えて

0

オブジェクトのクラスを取得してJAXBConextに渡すことができます。

public static String unparse(Object object, String encoding) throws JAXBException, SQLException { 
     JAXBContext jc = JAXBContext.newInstance(object.getClass()); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);   
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     StringWriter writer = new StringWriter(); 
     marshaller.marshal(object, writer); 
     return writer.toString(); 
    } 

使用法:応答のための

public void execute() { 
     String messageXml = unparse(messageObject, "UTF-8"); 
     String responseXml = unparse(responseObject, "UTF-8"); 
     String caseXml = unparse(caseObject, "UTF-8"); 
    } 
+0

おかげで、私は私の既存のヘルパーメソッドでより多くのコードスニペットを追加したことがわかり、私はできれば私が本当に混乱しています唯一のものがある。このような何かマーシャリングしようとしているすべてのクラスの代わりにヘルパーメソッドを呼び出すときに、ただ1つのクラス(上記の例ではレスポンスクラス)を渡してください – heisenseiberg

+0

プロダクションで動作する私のコードでは、すべての従属クラスを渡す必要はありませんマーシャラー。 – vssk

+0

すべての従属クラスを通過することなく動作しますしかし、私はそのようなことをするための短所があるかどうかはわかりません – heisenseiberg

関連する問題