@XmlAttribute含冒号命名致SoapUI无法导入WSDL的问题排查与解决
问题成因及解决方法
为什么会报错?
XML里的冒号(:)是命名空间前缀和本地名称的分隔符,不属于普通属性名称的一部分。你直接把asd:resource写在@XmlAttribute的name参数里时,JAXB会把整个字符串当成属性的完整名称,而不是识别asd为命名空间前缀。这违反了XML的命名规范,所以SoapUI解析WSDL时会抛出“无效名称”的错误。
而你只写@XmlAttribute时,属性名是asdResource(没有冒号),符合XML命名规则,所以能正常导入,但这显然不是你想要的带命名空间前缀的格式。
正确的解决方法
要生成带命名空间前缀的属性,你需要显式配置命名空间和前缀,而不是直接在name里加冒号,步骤如下:
在包级别声明命名空间和前缀
在你的实体类所在的包下,创建一个package-info.java文件,添加@XmlSchema注解来指定命名空间和对应的前缀:@XmlSchema( namespace = "http://your-custom-namespace.com/asd", // 替换成你的实际命名空间URL xmlns = { @XmlNs(prefix = "asd", namespaceURI = "http://your-custom-namespace.com/asd") }, elementFormDefault = XmlNsForm.QUALIFIED ) package com.your.project.package; // 替换成你的包路径 import javax.xml.bind.annotation.XmlNs; import javax.xml.bind.annotation.XmlNsForm; import javax.xml.bind.annotation.XmlSchema;修改@XmlAttribute注解
在你的属性上,指定name为本地名称(resource),同时通过namespace参数关联上面配置的命名空间:@XmlAttribute(name = "resource", namespace = "http://your-custom-namespace.com/asd") private String asdResource;
这样配置后,JAXB生成的WSDL会正确识别asd是命名空间前缀,resource是属性的本地名称,SoapUI就能正常导入WSDL,并且响应中的属性会显示为asd:resource,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Bambus
相关产品推荐
相关产品推荐

