关键点
- 确保参数名称保持一致
- 确保参数命名空间保持一致
- 确保接口命名空间保持一致
- 确保请求头设置正确
- 确保用soapui工具解析的参数结构一致
cxf常用注解
定义接口用到的注解
- 定义接口名称,和接口命名空间
@WebService(name=“ams” ,targetNamespace = “http://iface.xt.service.yyy.com”) - 定义方法
@WebMethod(action = “application/soap+xml;charset=utf-8”)
action是设置请求头,在客户端调用时,需要设置Header为application/soap+xml;charset=utf-8
- 定义返回值的参数名称
@WebResult(name = “out”) - 定义参数名称
@WebParam(name = “in0”)
自定义参数类用到的注解
- 指定参数类转xml根节点名称和命名空间
@XmlRootElement(name = “XqdxxEntity”, namespace = “http://entity.service.yyy.com”) - 指定参数类中属性的命名空间
@XmlElement(namespace = “http://entity.service.yyy.com”)
碰到的问题
参数是数组或集合,但是使用soapui工具解析出来的参数,cxf框架少了一层标签。
解决办法:
再定义一个类,包装一下参数类,使用这个类作为参数
@XmlRootElement(name = "CgqdxxEntities", namespace = "http://entity.service.yyy.com")
public class CgqdxxEntitiesWrapper {
private List<CgqdxxEntity> cgqdxxEntities;
@XmlElement(name = "CgqdxxEntity", namespace = "http://entity.service.yyy.com")
public List<CgqdxxEntity> getCgqdxxEntities() {
return cgqdxxEntities;
}
public void setCgqdxxEntities(List<CgqdxxEntity> cgqdxxEntities) {
this.cgqdxxEntities = cgqdxxEntities;
}
}
加注解,让生成的wsdl文档中,<xs:element form="unqualified"改成<xs:element form="qualified
- 使用 @XmlSchema 注解
在你的 Java 包中,你可以使用 @XmlSchema 注解来设置元素的命名空间和 elementFormDefault 属性。你可以创建一个 package-info.java 文件,设置 elementFormDefault 为 XmlNsForm.QUALIFIED。
示例 package-info.java 文件
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
@XmlSchema(
namespace = "http://example.com/ns",
elementFormDefault = XmlNsForm.QUALIFIED // 设置为 QUALIFIED
)
package com.example.service; // 根据你的实际包名修改
在这个示例中,elementFormDefault 设置为 QUALIFIED,这会使所有包内的元素都要求带上命名空间。
理解 form 属性
unqualified:该元素可以不带命名空间。
qualified:该元素必须带命名空间。