【问题标题】:Renaming an XML/SOAP tag using Apache CXF使用 Apache CXF 重命名 XML/SOAP 标记
【发布时间】:2019-06-28 16:11:31
【问题描述】:

我有一个使用 Apache CXF 作为实现的 SOAP Web 服务服务器。由于一些外部技术限制,我希望能够在入站 SOAP 请求中重命名一些 XML 标记命名操作参数(已弃用)。我正在阅读有关为此使用Interceptors 的信息,但是有关如何设置/配置它们的文档不是很清楚。

我发布端点的代码如下:

Endpoint endpoint = Endpoint.create(
    "http://schemas.xmlsoap.org/soap/", new MyServer());
endpoint.publish("ws/endpoint");

理想情况下,我只想将过滤器添加到给定的端点(我有几个)。

【问题讨论】:

    标签: soap cxf


    【解决方案1】:

    Apache's documentations关于拦截器很清楚(IMO),反正我的github profile中有一个helloworld项目(基于spring boot、cxf和maven)你可以看一下设置拦截器(其实这是一个 baisc autentication 拦截器)。

    为了设置一个拦截器(例如 InInterceptor),你的类应该扩展 AbstractPhaseInterceptor<Message> 并覆盖 handleMessage(Message message) 方法,然后在构造函数中你应该声明将应用拦截器的 phase。最后,您必须将其实例化并应用于 Endpoint。

    如你所说:

    重命名一些 XML 标记来命名操作参数(它们是 已弃用)在入站 SOAP 请求中

    我认为操作参数的名称(在 WSDL 文件中)与您的 Web 方法的参数不同。假设您的端点中有一个名为 addPerson 的方法:

    @WebMethod
    String addPerson(Person person) {
        /*method logic*/
    }
    

    和 Person 类:

    class Person {
        private String firstName;
        private String lastName;
        private Date birthDate;
        //getters and setters
    }   
    

    要将lastName 属性映射到不同的名称,您必须使用注释

    @XmlElement(name = "sureName")
    private String lastName;
    

    应用此注解后,sureName(在 wsdl 文件中)将映射到 lastName

    另外还有@WebParam注解可以用来改变web方法参数的名字:

    @WebMethod
    String sayHello( @WebParam(name = "sureName") String lastName);
    

    希望对你有帮助。

    【讨论】:

    • 你的答案的第二部分是不可能的,我必须重命名一个方法参数,我不能(我需要支持 API 的 v1 和 v2,其中方法参数 name 已被修改)。但无论如何感谢第一部分,我想我需要从 StaxInInterceptor 或类似的东西中激励自己。
    • 改变web方法参数的名字可以使用另一个注解来完成,我已经更新了我的答案,请看一下。
    • 诀窍是我需要同时支持 2 个名称(旧的和新的)。因此,原来的问题!否则我肯定会修改 @WebParam 名称:)
    • 现在我明白了你在帖子中所说的内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多