之所以写这篇文章是因为公司有一个项目要用webservice进行开发,由于之前没有接触过webservcie接口。因此在网上简单的学习了一下如果用java开发并发布webservice接口。
简单的webservice接口示例:
@WebService
public class JwsServiceHello {
/**
* 非静态方法,改方法会被发布出去
* @WebResult 该注解定义返回参数名称:
* <addResult>返回信息</addResult>
* @param userName 传入参数
* @return
*/
@WebResult(name="addResult")
public String getValue(@WebParam(name = "userName") String userName){
ReqXmlBean reqXmlBean=(ReqXmlBean) XMLUtil.convertXmlStrToObject(ReqXmlBean.class, userName);
BaseWarehouseinfoEntity baseWarehouseinfoEntity=(BaseWarehouseinfoEntity) reqXmlBean.getBodyInfo().getData();
System.out.println(baseWarehouseinfoEntity.getCompanyId());
return null;
}
/**
* 方法上加@WebMentod(exclude=true)后,此方法不被发布;
* @param name
* @return
*/
@WebMethod(exclude=true)
public String getHello(String name){
return "你好! "+name;
}
/** 静态方法不会被发布
* @param name
* @return
*/
public static String getString(String name){
return "我是!"+name;
}
public static void main(String[] args) {
/**
* 使用EndPoint(端点服务)发布一个WebService
* 参数:
* 服务暴露地址,
* 服务实现类
*/
Endpoint.publish("http://127.0.0.1:8080/Service/ServiceHello", new JwsServiceHello());
System.out.println("发布成功!");
//发布成功后 在浏览器输入 http://192.168.1.105:8080/Service/ServiceHello?wsdl
}
}
以上程序提供一个简单的webservice入门示例。在实际开发中,我们不能一个服务只处理一种业务,因此我在项目中选择了使用类似于统一网关接口的形式进行多模块开发。
一、//提供一个统一网关入口,通过解析请求参数中的当前请求服务和请求对应的方法名。
@WebService
@Component
public class xxx extends ApplicationObjectSupport implements xxx{
private final static Logger logger=Logger.getLogger(xxx.class);
private static ClassPathXmlApplicationContext context;
@Override
@WebResult(name="xxx")
public String xxx(@WebParam(name="xxx") String xxx) throws NoSuchMethodException, SecurityException, InstantiationException {
logger.info("进入统一接口入口");
try {
//拿到Spring IOC容器中的bean
Object object=context.getBean(xxx.beanName());
logger.info("当前请求服务为:"+xxx);
//获取执行逻辑方法
Method method=object.getClass().getMethod('对应逻辑的操作方法名', ‘参数类型’);
logger.info("当前请求服务方法:"+xxx.method());
//通过反射调用对应的实例方法
return method.invoke('实例对象', ‘参数’).toString();
} catch (Exception e) {
//具体异常捕获处理
logger.info("统一接口调用服务发生异常:"+e);
return ResXmlUtil.resXmlFaild("105", "系统错误");
}
}
注意:使用这种操作时,在service层的service注解中,bean的名称必须和参数传入的bean的名称一致。即:
service("beanName")与xxx.beanName()一致。
二、启动服务并发布webservice服务。
这里不使用tomcat启动程序,使用ClassPathXmlApplicationContext启动程序,并发布webservice服务
public static void main(String[] args) {
//setupClassPathXmlApplicationContext();
context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");//加载环境配置文件
context.start();//启动spring 容器并实例化容器
Endpoint.publish("http://127.0.0.1:9010/xxx",new xxxx());//发布webservice服务
System.out.println("发布成功");
}
三、查看是否发布成功-游览器访问http://127.0.0.1:9010/xxx?wsdl进行访问,会出现针对该服务的soap文档描述。