2017-09-06 11 views
5

AWSで実行されているEC2インスタンスの説明情報を取得する必要がある場合があります。これを達成するために、AWS Java SDKを使用しています。ユースケースの90%で、com.amazonaws.services.ec2.model.Instanceクラスがまさに私たちが必要とするクラスです。しかし、インスタンスを記述する生のXMLを取得することが有益な小さなユースケースもあります。すなわち、それ以前のXMLデータはInstanceオブジェクトに変換されます。 Instanceオブジェクト AWS Java SDKを使用してXML文字列を取得する方法はありますか?手動で一方を他方に変換する方法はありますか?または、HttpClientなどのXMLデータを取得するために別の呼び出しを行う必要がありますか?AWS Java SDKを使用してEC2インスタンスXMLの説明を取得しますか?

答えて

2

xml(たとえばAWS rest APIを直接使用する場合)の場合は、com.amazonaws.services.ec2.model.transform.*クラスを使用してxmlをjavaオブジェクトに変換できます。残念ながら、SDK自体に必要なクラスのみを提供しています。たとえば、InstanceStaxUnmarshallerを使用して生のXMLをインスタンスに変換できますが、そのようなコンバータを作成しない限り、インスタンスをXMLに変換することはできません。ここで

は、インスタンスのXMLを解析する方法の例です:

XMLEventReader eventReader = XMLInputFactory.newInstance().createXMLEventReader(new StringReader(instanceXml)); 
StaxUnmarshallerContext suc = new StaxUnmarshallerContext(eventReader, new TreeMap<>()); 
InstanceStaxUnmarshaller isu = new InstanceStaxUnmarshaller(); 
Instance i = isu.unmarshall(suc); 
System.out.println(i.toString()); 

あなたはおそらくまだSDKの時間のほとんどを使用しているときに生のXMLを保つことができるように、生のAWS応答を傍受しようとすることができます。しかし、それはかなりのコーディングを必要とするので、簡単には呼べません。

+0

これはまさに私が探していたものです!ありがとう!! – Shadowman

1

JAXB次のように.marshalを使用できます。 JAXB(Java Architecture for XML Binding)はJavaオブジェクトをXMLファイルに変換することができます。

StringWriter sw = new StringWriter(); 
JAXB.marshal(instance, sw); 
String xmlString = sw.toString(); 
0

AWS rest APIを使用して、Java SDKを置き換えることができます。 SDKのようにAmazonに統計データを送信しないため、ボーナスはわずかなパフォーマンス向上となります。

+0

以下のようにbeforeUnmarshalling()メソッドをオーバーライドするには、Java AWS SDKを使用して、JavaオブジェクトへのRESTのAPIからXMLをマーシャリングするためにそこに方法は何ですか? Java Objectの方がはるかに扱いやすい場合がありますが、XMLがうまくいくケースがいくつかあります。 – Shadowman

2

要求ハンドラを追加することにより、EC2Clientを作成し、

AmazonEC2ClientBuilder.standard().withRegion("us-east-1") 
    .withRequestHandlers(
      new RequestHandler2() { 
        @Override 
        public HttpResponse beforeUnmarshalling(Request<?> request, HttpResponse httpResponse) { 
         // httpResponse.getContent() is the raw xml response from AWS 
         // you either save it to a file or to a XML document 
         return new HTTPResponse(...); 
         // if you consumed httpResponse.getContent(), you need to provide new HTTPResponse 
        } 
       } 
     ).build(): 
関連する問題