一直为idea生成soap协议的webservices而纠结,当初做axis2的时候,用的是eclipse,用它的插件来生成。
这次做短信平台,决定要换一下,因为eclipse用axis2生成的接口,会增加很多无用的东西在WEB-INF下面。
摸索一下,招到了一些方法,这里记录下 。
配置项目
Idea中,配置项目,最常用的键,就是F4了。打开项目结构(Project Structure),其他配置好,然后在Facets中,增加一个Webservices。
下拉选项中,选择所需要的实现方式即可。我这里这次用的是JAX_WS RI 2.2,是glassfish的产品。
增加后,项目就有了WebServices的功能。
此时,会自动将下载的jar包放入工程,在web.xml中生成JAX-WS的配置信息。同时,也在WEB-INF下生成一个sun-jaxws.xml文件,不过里面目前是空白的,只有一个头。
生成服务类。
在自己的包下面,new一个webservices,然后输入自己的类名称即可,就会生成一个应用主类。例如:
@WebService()
publicclassHelloWorld{
@WebMethod
publicString sayHelloWorldFrom(String from){
String result ="Hello, world, from "+ from;
System.out.println(result);
return result;
}
publicstaticvoid main(String[] argv){
Object implementor =newHelloWorld();
String address ="http://localhost:9000/HelloWorld";
Endpoint.publish(address, implementor);
}
}
同时,在sun-jaxws.xml中,也生成了一段内容,对应刚刚生成的这个服务类。
运行该类,输入address在浏览器,可以看到服务列表,其中有一个http://localhost:9000/HelloWorld?wsdl ,即是提供为其他人的wsdl文件。
客户端验证
至此,我们可以写一个客户端,调用一下即可。具体的写法,可以参照之前本博客记录的一篇日志: JAX_WS 2.2 规范的webservices客户端实现(Axis2,Cxf)
话外篇
当使用这种方式时,有时候需要获取到客户端的ip信息,可以参照以下代码,这里以我发送短信为例:
import com.sun.net.httpserver.HttpExchange;
import com.sun.xml.ws.developer.JAXWSProperties;
import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.xml.ws.Endpoint;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import java.net.InetSocketAddress;
/*
* Created by wang on 2015/5/8.
*/
@WebService()
publicclassSendSms{
@Resource
WebServiceContext webServiceContext;
@WebMethod
publicString sayHelloWorldFrom(String from){
MessageContext mc = webServiceContext.getMessageContext();
HttpExchange exchange =(HttpExchange) mc.get(JAXWSProperties.HTTP_EXCHANGE);
InetSocketAddress remoteAddress = exchange.getRemoteAddress();
String remoteHost = remoteAddress.getHostName();
System.out.println("Client Host name :"+remoteHost);
String result ="Hello, world, from "+ from;
System.out.println(result);
return result+",nice work";
}
publicstaticvoid main(String[] argv){
Object implementor =newSendSms();
String address ="http://localhost:9000/SendSms";
Endpoint.publish(address, implementor);
}
}
这里不要导入错了包,以上代码,有很多个同名的包存在。
好了,所有就这些,用这种方式生成的webservices,简洁了太多,代码简洁,项目结构也简洁,很推荐这种方式。