概述
利用CXF框架和javax规范,通过自定义注解方式实现webservice配置和注册 让开发者可以不关心webservice复杂的底层,专注于业务逻辑的实现
自定义注解实现接口注册
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface AutoPublishWS {
//发布ws的path
String publishPath();
}
利用反射扫描注册
import lombok.extern.slf4j.Slf4j;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import org.springframework.web.context.WebApplicationContext;
/**
* @author Hasee
* @ClassName: AutoPublishWSEndPoint
* @Description:
* @date 2022/7/26
*/
@Slf4j
@Component
public class AutoPublishWSEndPoint implements ApplicationRunner {
@Autowired
private Bus bus;
@Autowired
private WebApplicationContext webApplicationContext;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("webservice 服务发布开始...");
String[] beanNames = webApplicationContext.getBeanNamesForAnnotation(AutoPublishWS.class);
EndpointImpl endPoint;
for (String beanName : beanNames) {
String publishPath = webApplicationContext.getType(beanName).getAnnotation(AutoPublishWS.class).publishPath();
endPoint = new EndpointImpl(bus, webApplicationContext.getBean(beanName));
endPoint.publish(publishPath);
log.info("发布接口:{} 成功",publishPath);
}
log.info("webservice 服务发布结束...");
}
}
声明式注解生成请求报文
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
//@XmlType(name = "")
@XmlRootElement(name = "PublishStrategy")
@Setter
@Slf4j
@NoArgsConstructor
@ToString
public class PublishStrategy implements Serializable {
@XmlElement(name = "PublishRegion", namespace = "http://xxx/emergency")
public String publishRegion; //发布范围
@XmlElement(name = "BoradcastDate_Time", namespace = "http://xxx/emergency")
public String broadcastTime; // 播发开始时间
@XmlElement(name = "Over_Date_Time", namespace = "http://xxx/emergency")
public String overTime; //播发结束时间
@XmlElement(name = "TTS_Name", namespace = "http://xxx/emergency")
public String tts_Name; //音频文件名称
@XmlElement(name = "TTS_URL", namespace = "http://xxx/emergency")
public String tts_Url; //音频文件下载地址
@XmlElement(name = "TTS_Abstract", namespace = "http://xxx/emergency")
public String tts_Abstravt; //音频文件摘要
@XmlElementWrapper(name = "BoradcastStyles", namespace = "http://xxx/emergency")
@XmlElement(name = "BoradcastStyle", namespace = "http://xxx/emergency")
public List<BoradcastStyle> boradcastStyles;
// @XmlTransient
// public String remark;
//
// @XmlTransient
// public Date createTime;
}
声明式注解生成响应报文
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "TestResp")
@Setter
@ToString
public class SoapMsgResvResp {
@XmlElement(name = "CallbackId", required = true)
private String callbackId;
@XmlElement(name = "InfoID", required = true)
private String infoID;
@XmlElement(name = "PlatformID", required = true)
private String platformID;
@XmlElement(name = "CallbackSendTime", required = true)
private String callbackSendTime;
@XmlElement(name = "Flag", required = true)
private Integer flag;
@XmlElement(name = "Reason")
private Integer reason;
}
服务接口
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.ws.rs.POST;
@WebService(targetNamespace = "http://xxxx/emergency")
public interface SoapMsgResvService {
@WebMethod
@POST
// @Path("*")
SoapMsgResvResp EBMainInfo(@WebParam(name = "Emergency_Info", targetNamespace = "http://xxxx/emergency") SoapMsgResvReq emergencyInfo);
}
服务接口实现
@Service
@AutoPublishWS(publishPath = "ReceiveXMLFromZytService")
@Slf4j
public class SoapMsgResvServiceImpl implements SoapMsgResvService {
@Override
public SoapMsgResvResp EBMainInfo(SoapMsgResvReq emergencyInfo) {
//TODO 业务逻辑处理
return soapMsgResvResp;
}
}
测试javax将对象转换为xml
try {
JAXBContext jc = JAXBContext.newInstance(SoapMsgResvReq.class);
Marshaller ms = jc.createMarshaller();
SoapMsgResvReq st = new SoapMsgResvReq();
st.setInfoID("xasdfsdfasdfsdf");
List<EBContent> list = new ArrayList<>();
EBContent ebContent = new EBContent();
ebContent.setLanguage("zh");
list.add(ebContent);
st.setEbContents(list);
ms.marshal(st, System.out);
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}