springboot整合webservice最佳实践

该博客介绍了如何在SpringBoot中结合CXF和javax规范,通过自定义注解简化Webservice的配置和接口注册。内容包括反射扫描注册、声明式注解生成请求和响应报文,以及服务接口的实现和使用javax进行对象到XML的转换测试。
摘要由CSDN通过智能技术生成

概述

利用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();

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿与禅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值