之前用EJB3.0结合JBoss开发Web服务作为某个课程的课程设计,Web服务开发出来后给在本机上的一个系统调用,一切正常。可到了别的机器上,别说调用了,连服务端的WSDL都查找不了。
后来花了很长一段时间从网上找了很多资料,发现问题的原因在于发布的WebService的WSDL中的<service><port></port></service>内的<soap:address>标签的location属性对应的IP被默认设置成“127.0.0.1(本机)”(见下图)。也就是说,Client端要调用该Web服务的时候,会被认为服务是在他自己的机器上(事实上该Web服务是在我的Server里头),显然Client端是根本没有该服务的。
原因是找到了,但网上提供的解决方法千奇百怪,当中很多文章都说要修改JBoss中的某个配置文件之类的,但按着它们的方法去做发现还是解决不了这个问题。又过了很长一段时间的今天,在某篇文章中看到一个关于JBoss的启动参数,发现原来JBoss在启动时可以定义不同的IP地址,即在命令控制台下进入JBoss_HOME/Bin/目录后键入命令run -b xxx.xxx.xxx.xxx,便可设置JBoss的IP(不跟任何参数的话默认是localhost或127.0.0.1)。例如,直接执行run的话,访问JBoss的控制台应该在地址栏中输入这个地址http://localhost:8080/,但如果我执行
run -b 192.168.1.104的话,访问JBoss的控制台就应该在地址栏中输入http://192.168.1.104:8080/。
由此受到启发,如果我以本机在某局域网中的IP地址启动JBoss,是否可以同时将JBoss发布的Web服务的发布地址也修改过来呢?于是立即动手试了一下,天呀,终于成功了,Web服务的WSDL的location终于改回来了(见下图)!
PS:
1.为了测试方便,我是用MyEclipse直接启动JBoss的。在MyEclipse中可按下面方法设置JBoss的启动参数:
Windows-->Preferences-->MyEclipse-->Servers-->JBoss-->选你自己的版本-->在Optional program arguments中输入启动参数-b 192.168.1.104-->重启MyEclipse(这步十分重要!)
这样设置之后,只要你用MyEclipse启动JBoss,JBoss的IP就会变成192.168.1.104了!
2.在局域网中想让别人能调用你写的Web服务,请将你机器上的防火墙关掉。(不过话说回来,Web服务是支持穿透防火墙的,之前的开启防火墙的访问失败应该还是IP地址的设置问题,具体没有验证过,有空一定要试验一下。)