使用Maven根据WSDL生成生成Java代码

Posted congcongdi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Maven根据WSDL生成生成Java代码相关的知识,希望对你有一定的参考价值。

转载:https://blog.csdn.net/pzasdq/article/details/52601473

为便于自己学习,整理

修改pom.xml

技术分享图片
 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 3   <modelVersion>4.0.0</modelVersion>
 4   <groupId>org.ygy.cxf</groupId>
 5   <artifactId>cxf-date</artifactId>
 6   <packaging>war</packaging>
 7   <version>0.0.1-SNAPSHOT</version>
 8   <name>cxf-date Maven Webapp</name>
 9   <url>http://maven.apache.org</url>
10   
11   <!-- 属性配置 -->
12     <properties>
13         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
14         <cxf.version>2.7.5</cxf.version>
15         <spring.version>3.1.1.RELEASE</spring.version>
16     </properties>
17 
18     <dependencies>
19         <dependency>
20             <groupId>junit</groupId>
21             <artifactId>junit</artifactId>
22             <version>4.10</version>
23             <scope>test</scope>
24         </dependency>
25 
26         
27         <dependency>
28             <groupId>org.apache.cxf</groupId>
29             <artifactId>cxf-rt-frontend-jaxws</artifactId>
30             <version>${cxf.version}</version>
31         </dependency>
32 
33         <dependency>
34             <groupId>org.apache.cxf</groupId>
35             <artifactId>cxf-rt-transports-http</artifactId>
36             <version>${cxf.version}</version>
37         </dependency>
38 
39         <dependency>
40             <groupId>org.apache.cxf</groupId>
41             <artifactId>cxf-rt-transports-http-jetty</artifactId>
42             <version>${cxf.version}</version>
43         </dependency>
44 
45         <dependency>
46             <groupId>org.springframework</groupId>
47             <artifactId>spring-context</artifactId>
48             <version>${spring.version}</version>
49         </dependency>
50 
51         <dependency>
52             <groupId>org.springframework</groupId>
53             <artifactId>spring-web</artifactId>
54             <version>${spring.version}</version>
55         </dependency>
56 
57         <dependency>
58             <groupId>org.eclipse.jetty</groupId>
59             <artifactId>jetty-webapp</artifactId>
60             <version>8.1.11.v20130520</version>
61         </dependency>
62 
63     </dependencies>
64 
65     <build>
66         <finalName>cxf-date</finalName>
67         
68         <plugins>
69             <plugin>
70                 <groupId>org.apache.cxf</groupId>
71                 <artifactId>cxf-codegen-plugin</artifactId>
72                 <version>${cxf.version}</version>
73                 <executions>
74                     <execution>
75                         <id>generate-sources</id>
76                         <phase>generate-sources</phase>
77                         <configuration>
78                             <sourceRoot>src/main/resources/cxf</sourceRoot>
79                             <wsdlOptions>
80                                 <wsdlOption>
81                                     <wsdl>http://localhost:8080/cxf-date/services/BookService?wsdl</wsdl>
82                                     <frontEnd>jaxws21</frontEnd>
83                                     <faultSerialVersionUID>1</faultSerialVersionUID>
84                                 </wsdlOption>
85                             </wsdlOptions>
86                         </configuration>
87                         <goals>
88                             <goal>wsdl2java</goal>
89                         </goals>
90                     </execution>
91                 </executions>
92             </plugin>
93         </plugins>
94     </build>
95 </project>
View Code

用cxf的wsdl2java工具生成客户端代码,但是发现生成的所有自定义的dto类的成员变量,都被映射成JAXBElement<T>的类型了,用起来很麻烦。

解决办法:

法一:后来经过试验,发现将wsdl里的nillable修改为false后,再产生的java代码就是简单的POJO了。(此方法生成成功的需要的代码,但不确定是否有弊端)

百科一下---------nillable:

一个指示符,指示是否可以将显式的零值分配给该元素。此项应用于元素内容并且不是该元素的属性。默认值为 false。

如果 nillable 为 true,将使该元素的实例可以将 nil 属性设置为 true。nil 属性被定义为实例的 XML 架构命名空间的一部分。

例如,下段定义了单个元素,同时将 nillable 设置为 true。

<xs:element name="myDate" type="xs:date" nillable="true"/>

法二:换一种调用方法(嫌麻烦,未尝试):

User user = new User();    
ObjectFactory objFac=new ObjectFactory();    
JAXBElement<String> name = objFac.createUserUsername("smallnest");    
user.setUsername(name); 

方法三:修改pom文件,添加-b参数,并添加自定义binding文件(因为不熟悉,没有测试生成成功)

<extraargs>
    <extraarg>-autoNameResolution</extraarg>
    <extraarg>-b</extraarg>
    <extraarg>my_binding.xml</extraarg>  
</extraargs>

my_binding.xml如下:

<jaxb:bindings version="2.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false" />
    </jaxb:bindings>
</jaxb:bindings>

 

 

 

以上是关于使用Maven根据WSDL生成生成Java代码的主要内容,如果未能解决你的问题,请参考以下文章

axis根据wsdl生成java客户端代码

如何使用 jaxb2-maven-plugin 2.x 从 WSDL 生成 Java 类?

使用axis2,根据WSDL生成java客户端代码

使用axis2,根据WSDL生成java客户端代码

使用Apache CXF根据wsdl文件生成代码

Axis2根据wsdl文件生成本地Java代码