Mamy scenariusz, w którym musimy pobrać informacje o opisie dla instancji EC2 uruchomionych na AWS. Aby to osiągnąć, używamy pakietu SDK Java AWS. W 90% przypadków użycia, klasa com.amazonaws.services.ec2.model.Instance
jest dokładnie tym, czego potrzebujemy. Istnieje jednak niewielki przypadek użycia, w którym korzystne byłoby uzyskanie surowego XML opisującego instancję. Oznacza to, że dane XML zanim zostaną przekształcone w obiekt Instance
. Czy istnieje sposób na uzyskanie zarówno obiektu Instance
obiektu i łańcucha XML za pomocą pakietu Java SDK AWS? Czy istnieje sposób ręcznej konwersji z jednej na drugą? Czy byłby on zmuszony do oddzielnego połączenia za pomocą HttpClient
lub czegoś podobnego, aby uzyskać dane XML?Uzyskaj opis XML instancji EC2 za pomocą AWS Java SDK?
Odpowiedz
Jeśli masz xml (np. Bezpośrednio z interfejsu API AWS), możesz użyć klas com.amazonaws.services.ec2.model.transform.*
do konwersji obiektów XML na java. Niestety, zapewnia tylko klasy wymagane dla samego SDK. Na przykład możesz przekonwertować nieprzetworzony XML na instancję za pomocą InstanceStaxUnmarshaller, ale nie możesz przekonwertować instancji na format XML, chyba że napiszesz taki konwerter.
Oto przykład jak do analizowania XML przykład:
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());
Prawdopodobnie może próbować przechwycić surową odpowiedź AWS, dzięki czemu można zachować surowego XML przy jednoczesnym użyciu SDK większość czasu. Ale nie nazwałbym tego tak łatwo, ponieważ będzie wymagało sporo kodowania.
Możesz użyć JAXB. JAXB (Java Architecture for XML Binding) może przekonwertować obiekt Java na/z pliku XML.
StringWriter sw = new StringWriter();
JAXB.marshal(instance, sw);
String xmlString = sw.toString();
Możesz użyć interfejsu API AWS dla odpoczynku, aby zastąpić Java SDK. Bonusem będzie niewielki wzrost wydajności, ponieważ nie będziesz wysyłać danych statystycznych do Amazon, tak jak robi to SDK.
Czy istnieje sposób, aby korzystać z Java SDK AWS i marszałek XML od reszty API do obiektów Java beforeUnmarshalling)? Są przypadki, w których obiekty Java byłyby o wiele wygodniejsze w pracy, ale kilka przypadków użycia, w których XML byłby lepszy. – Shadowman
Złóż EC2Client dodając żądania obsługi i nadpisać (metoda jak poniżej
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():
Dokładnie tego szukałem! Dzięki!! – Shadowman