gpt4 book ai didi

java - CXF,wsdl2java。自定义端口名称

转载 作者:行者123 更新时间:2023-11-29 09:40:29 25 4
gpt4 key购买 nike

简短的问题:我能否以某种方式绑定(bind) wsdl:port 名称以在服务中生成自定义 java 字段名称?

长问题:我有一个包含这样部分的 wsdl:

<wsdl:service name="123xxx">
<wsdl:port name="123xxxHttpSoap11Endpoint" binding="tns:123xxxSoap11Binding">
<soap:address location="..."/>
</wsdl:port>
</wsdl:service>

还有一个 Maven wsdl2java 目标,它生成名为 123xxx 的服务(我已经通过调用它 MyService 来修复绑定(bind))并在此服务中生成一个字段:

public class MyService extends Service {
...
public final static QName 123xxxHttpSoap11Endpoint =
new QName("http://new.webservice.namespace", "123xxxHttpSoap11Endpoint");
...
}

这会导致编译错误,因为在 Java 中变量不能以数字开头。而且我找不到一种方法可以在不更改原始 wsdl 的情况下以某种方式自定义生成的代码。

那么,有没有办法通过 cxf 绑定(bind)来绑定(bind)它,就像服务本身一样:

<bindings...>
<bindings node="wsdl:definitions/wsdl:service">
<class name="MyService"/>
</bindings>
</bindings>

或者是否有其他一些方法可以实现这一点?

最佳答案

终于找到了解决办法。当然,这是常见的 wsdl 生成过程的开销,但这只是(或几乎唯一)满足我的限制的方式。

首先查看了cxf库的源码,发现有生成Port元素的方法:

org.apache.cxf.tools.wsdlto.frontend.jaxws.processor.internal.ServiceProcessor#processPort

它只是创建带有名称的 JavaPort,从原始 wsdl 中获取并且不使用任何绑定(bind)处理它:

JavaPort jport = new JavaPort(NameUtil.mangleNameToClassName(port.getName().getLocalPart()));

进一步我发现可以注入(inject)自定义代码生成器,它负责从 cxf 模型创建 java 类。

经过一番研究,我发现 this answer 这帮助我做到了。

所以我用这样的类创建了一个单独的模块(查看评论):

//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 文件,很高兴看到它正在运行。

关于java - CXF,wsdl2java。自定义端口名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50338318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com