使用wsimport结合绑定文件自动生成Handler-Chain遇到的问题
看起来你遇到的问题是wsimport已经给目标类加上了@HandlerChain注解,但既没在注解里正确指定XML文件的引用路径,也没自动生成对应的handler chain XML文件对吧?我来帮你捋捋可能的问题点:
1. 命名空间版本不匹配
你的绑定文件里用了jaxws:bindings version="3.0"(对应Jakarta EE 9+版本),但javaee命名空间还是旧的Sun Java EE地址:http://java.sun.com/xml/ns/javaee,这会导致配置无法被正确识别。Jakarta EE 9+对应的命名空间应该是https://jakarta.ee/xml/ns/javaee,你需要把绑定文件里的xmlns:javaee替换成这个新地址。
2. wsimport不会自动生成handler chain XML文件
划重点:wsimport不会帮你自动创建handler chain的XML文件,它只会根据绑定文件的配置,在生成的服务类/端点类上添加@HandlerChain注解,而注解的file属性值需要你在绑定文件里明确指定。你当前的绑定文件只定义了handler链的内容,但没告诉wsimport注解里要指向哪个XML文件,自然也没法让它自动生成这个文件。
3. 正确的绑定文件配置示例
修改后的绑定文件应该是这样的(替换命名空间,同时明确指定handler chain文件的路径):
<?xml version="1.0" encoding="UTF-8"?> <jaxws:bindings version="3.0" xmlns="https://jakarta.ee/xml/ns/jaxws" xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" xmlns:javaee="https://jakarta.ee/xml/ns/javaee" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxws="https://jakarta.ee/xml/ns/jaxws" jaxb:extensionBindingPrefixes="xjc" wsdlLocation="WSDL_QUERY_OUT.XML"> <!-- Erstellen der Handler-Chain-Annotationen --> <jaxws:bindings node="wsdl:definitions"> <jaxws:handler-chains> <jaxws:handler-chain> <jaxws:handler> <jaxws:handler-name>SoapEndpointHandler</jaxws:handler-name> <jaxws:handler-class>com.test.resources.SoapEndpointHandler</jaxws:handler-class> </jaxws:handler> </jaxws:handler-chain> </jaxws:handler-chains> <!-- 指定@HandlerChain注解的file属性,指向你要放置的XML文件路径 --> <jaxws:package name="你的生成类包路径"> <jaxws:class name="你的端点类名"> <jaxws:annotation> <![CDATA[@jakarta.xml.ws.HandlerChain(file="handler-chain.xml")]]> </jaxws:annotation> </jaxws:class> </jaxws:package> </jaxws:bindings> </jaxws:bindings>
4. 手动创建handler chain XML文件
你需要自己在项目的对应路径下创建handler-chain.xml文件,内容就是你绑定文件里定义的handler链内容:
<?xml version="1.0" encoding="UTF-8"?> <handler-chains xmlns="https://jakarta.ee/xml/ns/javaee"> <handler-chain> <handler> <handler-name>SoapEndpointHandler</handler-name> <handler-class>com.test.resources.SoapEndpointHandler</handler-class> </handler> </handler-chain> </handler-chains>
5. 检查wsimport命令参数
确保你执行wsimport时正确指定了绑定文件参数,比如:
wsimport -b 你的绑定文件名.xml WSDL_QUERY_OUT.XML -d 生成类的输出目录
总结一下:wsimport只负责生成带注解的类,handler chain的XML文件需要你手动创建,同时要保证绑定文件的命名空间和注解配置正确匹配Jakarta EE 3.0的版本要求。
备注:内容来源于stack exchange,提问作者Net_Hans

