最近接触到了一个使用webservice传输数据的项目,其实在多年之前,webservice就成为了服务之间传输数据的重要框架。今天来回顾一下,将这两天遇到的一些问题记录一下。
webservice的作用:
首先webservice其实也是作为服务和客户端之间数据传输的一种方式。(其实两个服务之间调用,其中一个服务调用另一个服务,那么调用方也是可以理解成客户端,并不单单指的是服务器)。
简单理解就是服务端暴露出来了一个接口,可以供客户端去调用获取数据或传输数据。
如果用过springcloud的组件,就好像是在自己的微服务中把接口暴露出来,供其他服务去调用。只不过springcloud中调用走的是http的协议。
WerService的基础知识
这里可以去网上搜索一下webservice的协议等一些基础理论知识,有助于后续的理解
转载:https://www.cnblogs.com/Eillot/archive/2018/03/16/8583964.html
简单的案例:
这里我做的功能主要是其他服务的数据变更会推送到我的服务上来,然后我根据对应的数据把自己库中的数据进行同步。
@WebService
public interface UserSerivce {
public void saveUser(final List<User> dtoList);
}
@Slf4j
//主要是将当前impl交接给spirng容器管理
@Component
//endpointInterface 是对应的interface的包名
//targetNamespace 命名空间 一般是对应的包名倒叙
@WebService(endpointInterface = "com.xl.test.UserService", targetNamespace = "http://test.xl.com/UserService")
public class UserServiceImpl implements UserService {
/**
* 保存用户数据
*/
@Override
public void saveUser(final List<User> dtoList){
System.out.print("保存用户数据");
}
}
@Configuration
@Slf4j
public class WebServiceListener {
@Autowired
private UserServiceImpl userServiceImpl ;
@Value("${webservice.path}")
private String path;
@Bean
public Endpoint endpoint(){
String publishPath = path + "/UserService";
Endpoint publish = Endpoint.publish(publishPath, userServiceImpl );
log.info(">>>>>>>>>>webservice监听服务发布成功 发布地址:"+publishPath);
return publish;
}
}
这样当项目启动之后,就会自动注册并发布对应的接口,供其他服务访问。
------------------------------------------------------------------------注意事项-----------------------------------------------------
@Autowired 无法注入问题
在刚开始的时候,注册服务是适用的监听器去注册的,这样会导致一个问题,就是UserServiceImpl的service对象实际上是用过new创建出来的,并没有移交给spring去管理,所以调用saveUser的时候就会报空指针异常
初始版如下:
@Slf4j
public class WebServiceListener implements ApplicationRunner {
@Value("${webservice.path}")
private String path;
@Override
public void run(ApplicationArguments args) throws Exception {
String publishPath = path + "/UserService";
Endpoint.publish(publishPath, new UserServiceImpl());
log.info(">>>>>>>>>>webservice监听服务发布成功 发布地址:"+publishPath);
}
}
后续改成通过@Configuration+@Bean的方式去自动注入service,同时自动注册服务,将对象交由spring管理。