posts - 2,  comments - 2,  trackbacks - 0
  2006年9月21日

1、Aegis Binding这是XFire默认的绑定方式。
      他的特点是支持简单的绑定,不支持复杂的shema绑定。如果要实现复杂的schema绑定,需要自定义实现Type。
       1)public PurchaseOrderType receiveOrder(PurchaseOrderType po){......}
       2)public class PurchaseOrderType extends Type
            {
    
                 public ReferenceToDataType() {
                      setTypeClass(PurchaseOrderType.class);
                      setSchemaType(new QName(.. the QName of the type you're returning ..));
                 }

                 public void writeObject(Object value, XMLStreamWriter writer, 
                                    MessageContext context)
                 {
                      PurchaseOrderType data = (PurchaseOrderType) value;
                      ... do you're writing to the writer
                 }

                 publicObject readObject( MessageReader reader, MessageContext context )
                 {
                      // If you're reading you can read in a reference to the data
                      XMLStreamReader reader = context.getInMessage().getXMLStreamReader();

                      PurchaseOrderType data = read(reader);
                      return data;
                 }

                 public void writeSchema(Element schemaRoot)
                 {
                      // override this to write out your schema
                      // if you have it in DOM form you can convert it to YOM via DOMConverter
                 }
               }
2、Jibx绑定
     这种类型的绑定相对来说不需要自己写额外的代码,代是需要自己在开发之前进行Jibx的预编译,他会为我们生成相应的辅助类。但是这些东需要额外的配置,所以在开发过程中也不是很方便。
3、XMLBeans绑定
    这种绑定支持任意复杂的schema,可以自动生成javabean代码。
  
   唉,没时间了,有空再继续吧。现在先做个开始。

posted @ 2006-09-21 13:26 吃饭不洗手 阅读(1680) | 评论 (1)编辑 收藏

1、使用org.codehaus.xfire.spring.XFireSpringServlet与ServiceBean

1.1 web.xml的配置

 <web-app>
 <display-name>Spring Image Database</display-name>
 <description>Spring Image Database sample application</description>
 <!--
  These values are used by ContextLoaderListener, defined immediately below.
        The files listed below are used to initialize the business logic portion of the application.
        Each dispatcher servlet (defined further down) has their own configuration file,
        which may or may not depend on items in these files.
    -->
    <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>
     classpath:applicationContext-webservice.xml
    </param-value>
    </context-param>
 <!-- Log4j configuration listener-->
 <listener>
  <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
 </listener>
 <!-- Spring framework -->
 <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>

 <servlet>
        <servlet-name>XFireServlet</servlet-name>
        <display-name>XFire Servlet</display-name>
        <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
    </servlet>
              
    <servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

 <welcome-file-list>
  <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 
</web-app>

1.2 applicationContext-webservice.xml的配置:

<beans>

    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
   
    <bean name="echoService" class="org.codehaus.xfire.spring.ServiceBean">
        <property name="serviceBean" ref="echo"/>
        <property name="serviceClass" value="org.codehaus.xfire.test.Echo"/>
        <property name="inHandlers">
            <list>
                <ref bean="addressingHandler"/>
            </list>
        </property>
    </bean>

    <bean id="echo" class="org.codehaus.xfire.test.EchoImpl"/>

    <bean id="addressingHandler" class="org.codehaus.xfire.addressing.AddressingInHandler"/>
 
   <bean name="bookService" class="org.codehaus.xfire.spring.ServiceBean">
        <property name="serviceBean" ref="bookServiceBean"/>
        <property name="serviceClass" value="org.codehaus.xfire.demo.BookService"/>
    </bean>

    <bean id="bookServiceBean" class="org.codehaus.xfire.demo.BookServiceImpl"/>

</beans>

1.3 这样将会发布两个service,BookServiceEchoService。随后就可以使用client端进行测试了。

     //测试BookService
    public static void main(String args[])
    { 
        String serviceURL = "http://127.0.0.1:9001/xfire/services/BookService";
        Service serviceModel = new ObjectServiceFactory().create(BookService.class,null,"http://xfire.codehaus.org/BookService",null);
        XFireProxyFactory serviceFactory = new XFireProxyFactory();
        try
        {
            BookService service = (BookService) serviceFactory.create(serviceModel, serviceURL);
            Client client = Client.getInstance(service);
            client.addOutHandler(new OutHeaderHandler());
            Book[] books = service.getBooks();
            System.out.println("BOOKS:");
            for (int i = 0; i < books.length; i++)
            {
                System.out.println(books[i].getTitle());
            }
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }
    }

1.4 忘了BookService及其实现了。

     public interface BookService
    {
              public Book[] getBooks();
   
              public Book findBook(String isbn);
   
             public Map getBooksMap();
   }

 

    public class BookServiceImpl implements BookService
    {
    private Book onlyBook;
   
    public BookServiceImpl()
    {
        onlyBook = new Book();
        onlyBook.setAuthor("Dan Diephouse");
        onlyBook.setTitle("Using XFire");
        onlyBook.setIsbn("0123456789");
     }

     public Book[] getBooks()
     {
        return new Book[] { onlyBook };
     }
   
     public Book findBook(String isbn)
     {
        if (isbn.equals(onlyBook.getIsbn()))
            return onlyBook;
       
        return null;
     }

     public Map getBooksMap() {
  Map result = new HashMap();
  result.put(onlyBook.getIsbn(), onlyBook);
  return result;
     }
    }

1.5 简单的测试就是通过IE,输入http://ip:port/context/services/BookService?wsdl或者http://ip:port/context/services/EchoService?wsdl,将会出现相应的wsdl文档。

     如果只是输入http://ip:port/context/services/BookService,会出现Invalid SOAP request.这也说明配置正确。

2、直接集成Spring(通过Spring的org.springframework.web.servlet.DispatcherServlet)

2.1 web.xml配置
<web-app>
<!-- START SNIPPET: xfire -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        classpath:org/codehaus/xfire/spring/xfire.xml</param-value>
    </context-param>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/log4j.properties</param-value>
    </context-param>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>xfire</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>xfire</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
<!-- END SNIPPET: xfire -->
</web-app>
2.2 xfire-servlet.xml配置
<beans>
    <!-- START SNIPPET: xfire -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">
            <map>
                <entry key="/EchoService">
                    <ref bean="echo"/>
                </entry>
            </map>
        </property>
    </bean>

    <bean id="echoBean" class="org.codehaus.xfire.spring.example.EchoImpl"/>

    <!-- Declare a parent bean with all properties common to both services -->
    <bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter">
        <property name="serviceFactory">
            <ref bean="xfire.serviceFactory"/>
        </property>
        <property name="xfire">
            <ref bean="xfire"/>
        </property>
        <property name="serviceBean">
            <ref bean="echoBean"/>
        </property>
        <property name="serviceClass">
            <value>org.codehaus.xfire.spring.example.Echo</value>
        </property>
    </bean>
    <!-- END SNIPPET: xfire -->
</beans>
2.3 余下的配置跟第一种方法一样。

3、另外xfire的官方文档上还有一种方法,是通过XBean与Spring结合来实现webservice的expose。还是觉得上面的两种方法比较好。既然已经与spring集成在一起了,何必再引入其他的呢?以后的维护是不是也要有问题呢?

 在随后的文章里将会介绍xfire与Jibx结合的例子。

posted @ 2006-09-21 09:42 吃饭不洗手 阅读(1928) | 评论 (1)编辑 收藏