遇到http://java.net/jira/browse/JAXB-131后,我们正在尝试采用其注释中提供的解决方法,即在xjc的命令行上提供-enableIntrospection。
然而,当我这样做时:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxws-maven-plugin</artifactId>
<version>1.12</version>
<executions>
<execution>
<id>allservice</id>
<goals>
<goal>wsimport</goal>
</goals>
<configuration>
<xjcArgs><xjcArg>-enableIntrospection</xjcArg></xjcArgs>
<extension>true</extension>
<wsdlDirectory>src/main/webapp/WEB-INF/wsdl</wsdlDirectory>
<bindingDirectory>src/main/resources/bindings</bindingDirectory>
<target>2.0</target>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>javax.jws</groupId>
<artifactId>jsr181-api</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</plugin>
maven构建失败了:
[DEBUG] The binding Directory is C:\Source\workspace\TheProject\src\main\resources\bindings
[DEBUG] jaxws:wsimport args: [-s, C:\Source\workspace\TheProject\target\jaxws\wsimport\java, -d, C:\Source\workspace\TheProject\target\classes, -target, 2.0, -extension, -Xnocompile, -B-enableIntrospection, -b, C:\Source\workspace\TheProject\src\main\resources\bindings\servicebindings.xml]
[INFO] jaxws:wsimport args: [-s, C:\Source\workspace\TheProject\target\jaxws\wsimport\java, -d, C:\Source\workspace\TheProject\target\classes, -target, 2.0, -extension, -Xnocompile, -B-enableIntrospection, -b, C:\Source\workspace\TheProject\src\main\resources\bindings\servicebindings.xml, C:\Source\workspace\TheProject\src\main\webapp\WEB-INF\wsdl\CaseService.wsdl]
no such JAXB option: -enableIntrospection
如何在jaxws-maven-plugin中使用xjc的-enableIntrospection?如果我不能,有什么替代方法可以自定义jaxws的代码生成,以便Boolean
属性的getter被称为getFoo()
(正确)而不是isFoo()
(这违反了Java Beans规范) )。
答案 0 :(得分:1)
似乎jaxws-maven-plugin使用已安装的JDK中的xjc。在添加对-enableIntrospection的支持之前,最新的Oracle JDK仍包含一个XJC版本。
我接下来研究了使用JAXB-Plugin。 turns out jaxws-maven-plugin没有提供附加到XJC的类路径的简单方法,这是加载JAXB-Plugins所必需的。
由于政治原因而不能替换jaxws-maven-plugin(类似“jaxws是标准的,只能使用标准库”)。
因此我回过头来编写一个maven插件,在生成后读取源代码,
content.replace("public Boolean is", "public Boolean get");
并将源文件写回磁盘。这也允许我注入equals()
和hashCode()
的定义,这些定义依赖于我正在使用的API中的业务键的命名约定。
答案 1 :(得分:1)
将布尔值的getter添加到JAX-WS生成的工件中,而不是使用enableIntrospection选项和Java认可的覆盖机制。
只有JAX-WS RI 2.1.13支持选项enableIntrospection。但是JavaSE6 1.6.0_65附带了JAVA-WS RI 2.1.6。解决此问题的一种方法是使用Java认可的覆盖机制,将jaxws-api.jar和jaxb-api.jar复制到JRE / JDK背书目录中。
另一种方法是不使用enableIntrospection选项,而是将布尔值的getter添加到JAX-WS生成的工件中。可以使用replacer maven插件添加这些getter。
Maven replacer插件添加get方法:
<plugin>
<groupId>com.google.code.maven-replacer-plugin</groupId>
<artifactId>replacer</artifactId>
<version>1.5.2</version>
<executions>
<execution>
<phase>process-resources</phase>
<goals>
<goal>replace</goal>
</goals>
</execution>
</executions>
<configuration>
<basedir>${project.basedir}</basedir>
<includes>
<include>src/main/java/lu/etat/cie/rn/rpp/ws/**/*.java</include>
</includes>
<token>public Boolean is(.*)\(\)(\s*\{\s*.+\s*\})</token>
<value>public Boolean is$1\(\)$2
public Boolean get$1\(\)$2</value>
</configuration>
</plugin>
替代:
public Boolean isProperty() {
return property;
}
使用:
public Boolean isProperty() {
return property;
}
public Boolean getProperty() {
return property;
}
答案 2 :(得分:0)
你可以试试
<enableIntrospection>true</enableIntrospection>
在<configuration>
我也可以找到:
<args>
<arg>-enableIntrospection</arg>
</args>
在
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>