spirngboot整合webservice入门(@Autowired 无法注入问题)

最近接触到了一个使用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管理。

参考文章:https://blog.csdn.net/weixin_43915881/article/details/107630575?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

 

上一篇:spring IOC笔记,@Autowired 与@Resource


下一篇:Springboot使用@Autowired注解静态对象