有段时间没有学习SOA了,最近偶然碰到一个例子,运行修改理解后发布到此。
在前面的博客中有提到用axis2发布web service,借用了插件,并且步骤较繁多,现在来看下tuscany简单地通过配置文件来发布web service。(工具eclipse 3.5)
1. 新建动态web项目,指定classpath编译后的存储路径为WebContent/WEB—INF/classes。(可右键项目,属性,Java Build Path,Source修改)将Tuscany的jar包都复制到webContent/Web-INF/lib下(此处使用的Tuscany 1.6,最新版本是2.0以上,不要提醒我说有些jar包不是必须的...都加进去也不多,省的到处提示你报错)。
2. 新建接口、实现类等。
User实体类
package tuscany.webService.service; public class User { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
IUserservice服务接口
package tuscany.webService.service; import java.util.List; import org.osoa.sca.annotations.Remotable; //测试发现是必须的 @Remotable public interface IUserservice { List<User> getAll(); }
IUserservice接口实现类-UserServiceImpl.java
package tuscany.webService.service; import java.util.*; // implements IUserservice 可以不写,在构件配置中写出即可 public class UserServiceImpl{ private static List<User> users = null; public List<User> getAll() { User user1=new User(); user1.setName("user1"); User user2=new User(); user2.setName("user2"); users=new ArrayList<User>(); users.add(user1); users.add(user2); return users; } }
给出文件结构图,便于设置发布文件时对照观看-
3. 配置发布文件
3.1 构件配置文件(.composite)-构件配置文件是用于指出发布的服务(service)和实现该服务的组件(component)
在classpath(根路径下)新建User.composite
<?xml version="1.0" encoding="UTF-8"?> <composite xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0" name="UserComposite" targetNamespace="http://test.tuscany.webService"> <!--composite元素中name为该构件的名,在sca-contribution部署composite时被使用 此处的targetNamespace与sca-contribution中的targetNamespace必须相同 --> <!--组件,实现了服务UserService--> <component name="UserServiceImpl"> <implementation.java class="tuscany.webService.service.UserServiceImpl"></implementation.java> </component> <!--对外提供的服务--> <service name="UserService" promote="UserServiceImpl"> <interface.java interface="tuscany.webService.service.IUserservice" /> <!--定义了发布服务绑定的协议,使用webservice--> <binding.ws></binding.ws> </service> </composite>
补充:也可以在src下新建一文件夹或者包用于存放.composite文件,前提就是需要保证编译后的文件会被放到WEB-INF/classes下面。元素composite中的name为构件名。
3.2 部署文件(sca-contribution.xml),放在WebContent/META-INF下。
<?xml version="1.0" encoding="UTF-8"?> <contribution xmlns="http://www.osoa.org/xmlns/sca/1.0" xmlns:tuscanyWeb="http://test.tuscany.webService"> <!-- 指出要部署的构件,格式为-命名空间别名:构件名 --> <deployable composite="tuscanyWeb:UserComposite"/> </contribution>
补充:.composite中的targetNamespace=sca-contribution.xml中的xmlns:tuscanyWeb的值!xmlns:tuscanyWeb可以随便命名,只是用来代表命名空间,在deployable元素中使用,deployable元素中指出的构件名为.composite文件中composite元素的name属性值。无需指出composite文件的存储位置,tuscany会自动搜索。
4. web.xml中配置Tuscany拦截器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>TuscanyWebService</display-name> <filter> <filter-name>tuscany</filter-name> <filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class> </filter> <filter-mapping> <filter-name>tuscany</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
将应用发布到应用服务器上,输入http://localhost:8080/TuscanyWebService/UserService?wsdl,即可看到服务UserService的WSDL描述文件,表示web服务发布成功,可以外部调用。(本例是使用的应用服务器为tomcat6.0)。应用发布可以打包成war包放到tomcat/webapps下,启动startup.bat。在eclipse中,直接右键项目,run as, run on server。