我有一个 soap 网络服务,我想将响应和请求记录为 xml 字符串。 我知道拦截器,但出于某种原因,没关系,我不能使用它们。 如何从 xml 消息解码到的对象构造 xml 请求(和响应)?如何将对象重新编码为 xml 字符串?
感谢您的帮助。
最佳答案
为了 Marshal/Unmarshall,您需要创建一个与 XML 文档相同的类“层次结构”。所以,例如:
<tests>
<lib-data>
<library>Library</library>
<count>64018</count>
<test-data>
<title>Book title1</title>
<book>Book Name1</book>
<count>5</count>
</test-data>
<test-data>
<title>Book title2</title>
<book>Book Name3</book>
<count>5</count>
</test-data>
<test-data>
<title>Book title3</title>
<book>Book Name3</book>
<count>4</count>
</test-data>
</lib-data>
</tests>
我会创建一个带有单个属性的“测试”类——一个“lib-data”类的 ArrayList。
然后,在每个 lib-data 类中,我将创建一个名为 library 的 String 字段、一个名为 count 的 int 字段和一个“test-data”类的 ArrayList。
然后我会为每个测试数据类创建 String title 和 book 属性以及一个 int count 属性。
从那里,只需添加正确的@XmlRootElement(在每个类之前)和@XmlElement(在每个属性之前)注释。在那之后,您可以使用 Jaxb 进行实际的编码和解码。
编辑:
抱歉,你的问题很开放,所以我不确定你创造了多少。
XML 注释非常简单,“测试”类看起来像这样:
@XmlRootElement
public class Tests {
@XmlElement(name="lib-data")
ArrayList<LibData> libData;
public Tests()
{
this.libData = new ArrayList<LibData>()
}
public ArrayList<LibData> getLibData() {
return this.libData;
}
public void setLibData(ArrayList<LibData> libData) {
this.libData = libData;
}
}
我还会创建一个“MarshalHandler”类,它隐藏了编码和解码的实现细节:
public class MarshalHandler {
private JAXBContext jc;
private Unmarshaller unmarshaller;
private Marshaller marshaler;
public MarshalHandler(){
jc = JAXBContext.newInstance(Tests.class);
unmarshaller = jc.createUnmarshaller();
marshaler = jc.createMarshaller();
}
public Test unmarshall(File f){
return (Tests) unmarshaller.unmarshal(f);
}
public void marshal(Tests t, String fileLoc){
OutputStream os = new FileOutputStream(fileLoc);
marshaler.marshal(t, os);
os.flush();
os.close();
}
}
(我没有编译或测试该代码。它可能包含一两个错误并且绝对不考虑异常)
现在,您如何处理 MarshalHandler 的细节完全取决于您,并且会受到程序总体设计的影响。例如,您可能希望编码方法返回 StreamResult 而不是保存到预定的 fileLoc。也许您正在获取此 SOAP 响应并将其保存为字节数组,在这种情况下,最好能够将该数组直接传递给您的解码方法。但是,如果没有更多细节就很难说。
关于java - CXF:记录请求和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20762067/