我们有一个场景,我们需要检索在AWS上运行的EC2实例的描述信息。为此,我们使用AWS Java SDK。在我们90%的用例中,com.amazonaws.services.ec2.model.Instance
类正是我们所需要的。但是,还有一个小用例,获取描述实例的原始XML将是有益的。也就是说,它之前的XML数据被转换为Instance
对象。有没有办法使用AWS Java SDK同时获取Instance
对象和 XML字符串?有没有办法手动从一个转换到另一个?或者,我们是否会被迫使用HttpClient
或类似的东西单独调用以获取XML数据?
答案 0 :(得分:2)
通过添加请求处理程序创建EC2Client并覆盖beforeUnmarshalling()方法,如下所示
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():
答案 1 :(得分:1)
您可以使用 JAXB .marshal,如下所示。 JAXB (用于XML绑定的Java体系结构)可以将Java对象转换为XML文件或从XML文件转换。
StringWriter sw = new StringWriter();
JAXB.marshal(instance, sw);
String xmlString = sw.toString();
答案 2 :(得分:1)
如果你有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());
您可能会尝试拦截原始AWS响应,以便您可以在大多数时间仍使用SDK的同时保留原始XML。但我不会那么容易,因为它需要相当多的编码。
答案 3 :(得分:0)
您可以使用AWS rest API替换Java SDK。奖励将是轻微的性能提升,因为您不会像SDK那样向亚马逊发送统计数据。