Переименование тега XML / SOAP с использованием Apache CXF - PullRequest
1 голос
/ 28 июня 2019

У меня есть сервер веб-службы SOAP, использующий Apache CXF в качестве реализации. Из-за некоторых внешних технических ограничений я хотел бы иметь возможность переименовывать некоторые XML-теги , называя параметр операции (который не рекомендуется) во входящем SOAP-запросе. Я читал об использовании Interceptors для этого, но документация о том, как их настроить / настроить, не очень понятна.

Мой код для публикации конечной точки следующий:

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

В идеале я хотел бы добавить фильтр только к данной конечной точке (у меня их несколько).

1 Ответ

1 голос
/ 08 июля 2019

Документация Apache о перехватчиках довольно ясна (IMO), в любом случае, в моем профиле github есть проект helloworld (основанный на весенней загрузке, cxf и maven), который вы можете обратите внимание на настройку перехватчиков (на самом деле это перехватчик baisc autentication).

Для настройки перехватчика (например, InInterceptor) ваш класс должен расширить AbstractPhaseInterceptor<Message> и переопределить метод handleMessage(Message message), затем в конструкторе вы должны объявить phase, в котором будет применяться перехватчик. Наконец, вы должны создать его экземпляр и применить к конечной точке.

Как вы сказали:

переименовать некоторые XML-теги с именами параметров операции (которые не рекомендуется) во входящем SOAP-запросе

Я думаю, что имя параметра операции (в файле WSDL) отличается от аргумента вашего веб-метода. Предположим, что в вашей конечной точке есть метод с именем 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 аннотация, которую можно использовать для изменения имени аргументов веб-метода:

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

Надеюсь, это поможет.

...