Наконец я нашел решение.
Конечно, это накладные расходы для общего процесса генерации wsdl, но это единственный (или почти единственный) способ удовлетворить мои ограничения.
Сначала я проверил источники библиотеки cxf
и обнаружил, что есть метод генерации элемента Port:
org.apache.cxf.tools.wsdlto.frontend.jaxws.processor.internal.ServiceProcessor#processPort
, который просто создает JavaPort
с именем, извлеченным из оригинала wsdl
и не обрабатывает его с какой-либо привязкой:
JavaPort jport = new JavaPort(NameUtil.mangleNameToClassName(port.getName().getLocalPart()));
Идя дальше, я обнаружил, что есть возможность добавить пользовательский генератор кода, который отвечает за создание java
классов из cxf
модели.
После некоторого исследования я нашел этот ответ , который помог мне сделать это.
Итак, я создал отдельный модуль с таким классом (проверьте комментарии):
//note that I've put my class inside the package,
//which is used for other default generators in cxf
package org.apache.cxf.tools.wsdlto.frontend.jaxws.generators;
import java.util.List;
import java.util.Map;
import org.apache.cxf.tools.common.ToolContext;
import org.apache.cxf.tools.common.ToolException;
import org.apache.cxf.tools.common.model.JavaPort;
import org.apache.cxf.tools.common.model.JavaServiceClass;
public class CustomSEIGenerator extends SEIGenerator {
@Override
public void generate(ToolContext penv) throws ToolException {
//no streams, because we still on java 7
//fetch all services
Map<String, JavaServiceClass> ss = penv.getJavaModel().getServiceClasses();
for (Map.Entry<String, JavaServiceClass> s : ss.entrySet()) {
//fetch all ports from each service
for (JavaPort port : s.getValue().getPorts()) {
//set custom name to each port
port.setName("_" + port.getName);
}
}
}
}
и поместил tools-plugin.xml
в папку META-INF
:
<?xml version="1.0" encoding="utf-8"?>
<plugin xmlns="http://cxf.apache.org/tools/plugin" name="play" version="" provider="play.typesafe.com">
<frontend name="sample" package="org.apache.cxf.tools.wsdlto.frontend.jaxws" profile="JAXWSProfile">
<container name="JAXWSContainer" package="org.apache.cxf.tools.wsdlto.frontend.jaxws" toolspec="jaxws-toolspec.xml"/>
<processor name="WSDLToJavaProcessor" package="org.apache.cxf.tools.wsdlto.frontend.jaxws.processor"/>
<builder name="JAXWSDefinitionBuilder" package="org.apache.cxf.tools.wsdlto.frontend.jaxws.wsdl11"/>
<generators package="org.apache.cxf.tools.wsdlto.frontend.jaxws.generators">
<generator name="CustomSEIGenerator"/>
<generator name="AntGenerator"/>
<generator name="ClientGenerator"/>
<generator name="FaultGenerator"/>
<generator name="ImplGenerator"/>
<generator name="SEIGenerator"/>
<generator name="ServerGenerator"/>
<generator name="ServiceGenerator"/>
</generators>
</frontend>
</plugin>
(обратите внимание, что я поставил свой собственный генератор перед стандартным, чтобы он работал с измененной моделью).
Далее я только что изменил свой pom-файл в соответствии с ответом, который я разместил выше, и был рад видеть, что он работает.