JAXB解组时JavaDoc生成出现'>'字符未转义错误的问题求助
结合你给出的技术栈(CXF 3.4.4、Spring 4.1.6、SLF4J 1.7.9,JAXB 2.3.0),以及遇到的JavaDoc报错——生成的ActionType.java中Javadoc里的>未被转义,而<被转成了<(你看到的&lt;其实是双重转义后的结果,本质是HTML转义的<),这个问题根源出在CXF代码生成阶段的JAXB XJC插件转义逻辑,而非运行时的Unmarshaller配置(你设置的jaxb.encoding对代码生成的JavaDoc完全不起作用)。
给你几个可行的解决方向:
1. 给CXF CodeGen插件添加XJC转义参数
CXF的wsdl2java工具底层依赖JAXB的XJC来生成Java代码,我们可以通过添加XJC的扩展参数强制转义所有XML特殊字符(包括>)。在你的Maven cxf-codegen-plugin配置里添加以下extraargs:
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf-version}</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>你的WSDL文件路径.wsdl</wsdl> <!-- 添加XJC转义参数 --> <extraargs> <extraarg>-xjc-arg</extraarg> <extraarg>-XescapeXML</extraarg> </extraargs> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin>
-XescapeXML参数会让XJC在生成Javadoc时,把所有XML特殊字符(<、>、&等)都转成对应的HTML实体,这样JavaDoc解析时就不会出现bad use of '>'的错误。
2. 排查JAXB依赖的兼容性与冲突
你当前把JAXB依赖设为provided,要确认容器提供的JAXB版本是否和CXF 3.4.4兼容。CXF 3.4.x官方推荐使用JAXB 2.3.x,但如果容器里的JAXB版本过低或过高,可能会导致转义逻辑异常。可以尝试临时将JAXB依赖的scope改为compile,排除容器提供的版本,看看问题是否解决:
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> <!-- 临时改为compile,排查冲突 --> <scope>compile</scope> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0</version> <scope>compile</scope> </dependency>
3. 临时应急方案:生成后批量替换
如果上述方案暂时无法生效,你可以在Maven的generate-sources阶段之后,添加一个执行脚本的步骤,批量替换生成代码中Javadoc里的>为>。比如用Maven的exec-maven-plugin执行sed命令(Linux环境):
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <phase>process-sources</phase> <goals> <goal>exec</goal> </goals> <configuration> <executable>sed</executable> <arguments> <argument>-i</argument> <argument>'s/\(<\/*complexType.*>\)/\&gt;/g'</argument> <argument>${project.build.directory}/generated-sources/cxf/at/ActionType.java</argument> </arguments> </configuration> </execution> </executions> </plugin>
这个方案是治标不治本,但可以快速解决当前的JavaDoc构建报错问题。
内容的提问来源于stack exchange,提问作者Michu93

