java - CXF:记录请求和响应

标签 java xml soap cxf marshalling

我有一个 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/

相关文章:

javascript - JQuery 无法处理 soap 响应

soap - 有哪些好的 WWSAPI 信息源?

java - 如果静态方法不能被覆盖,它如何在这里工作(对于 Java)?

java - 如何在代号一中修改工具栏的后退命令按钮(后退箭头)?

java - 如何在 Android 上使用 Wobly 序列化器

javascript - 如何从 Web 应用程序在客户端计算机上创建临时文件?

使用 AXIS2 运行 web 服务时,tomcat 服务器日志中的 java.lang.ClassCastException

java - 这个Java程序有什么问题?

java - XSLT 处理与 Java : passing xml content in parameter

java - 按钮未在第一次单击时调用 OnClickListener