jeffy

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            70 Posts :: 1 Stories :: 14 Comments :: 0 Trackbacks

          2008年4月1日 #


          查看tomcat的錯誤日志, 錯誤原因是:javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found

          是由于jdk1.5 與 tomcat5.0之間的關于 TransformerFactoryImpl 類的沖突造成的。

          用高版本的tomcat就可以解決。

          posted @ 2008-08-28 22:22 Live-in Java 閱讀(579) | 評論 (0)編輯 收藏

           1.  打開HKEY_CURRENT_USER\Software\Microsoft\Office\11.0(如果是Outlook XP,此處為10.0)\Outlook\Preferences項目
            2.  建立一個DWord的值(雙字節值),名稱為"MinToTray", 取值改成 1
          posted @ 2008-08-21 16:35 Live-in Java 閱讀(247) | 評論 (0)編輯 收藏

          ---刪除用戶及其用戶下面的所有對象
          drop user ca cascade;(刪除用戶下面的所有對象,注意關鍵字cascade)
          ---刪除表空間及其表空間里的所有內容
          drop tablespace ATMV INCLUDING CONTENTS;(刪除表空間)
          drop tablespace INDX INCLUDING CONTENTS;(刪除表空間)
          ----創建表空間,指定數據文件,初始化100M 自增加50M
          create tablespace ATMV datafile 'D:/oracle/product/10.2.0/oradata/orcl/ATMV.dat' size 100m autoextend on next 50m maxsize unlimited;
          create tablespace INDX datafile 'D:/oracle/product/10.2.0/oradata/orcl/INDX.dat' size 100m autoextend on next 50m maxsize unlimited;
          -----創建用戶,指定表空間
          create user ca identified by atm123 default tablespace ATMV ;
          ---給用戶授權
          grant dba to ca;

          ---運行SQL文件
          @D:\workspace\JATMP\ChannelAge.sql

          posted @ 2008-08-15 11:11 Live-in Java 閱讀(3468) | 評論 (0)編輯 收藏

          關于axis1.2中對象的序列化和發序列化                            

          我從開始使用wtp來開發web service開始, 就在思考一個問題:
          那些java的對象是可以序列化為xml的, 并且可以從xml反序列化為java對象的?
          那些對象與xml之間不能夠序列化和反序列化?
          在開發的時候應該注意哪些問題?

          根據我的理解, 有如下幾種對象:
          1)axis1.2內在支持的幾種對象類型。
                    這幾種內在支持的對象包括:
                    java基本類型 : int, float,,,,
                    基本類型包裝類 : Integer, Float, Long...
                    還有String, Date, Calendar, BigDecimal, BigInteger, List, Map.
              凡是這些內在支持的對象, 不管他們作為某個Service的input 還是 output, 我們在服務端的axis1.2的WEB-INF/server-config.wsdd的該Service的定義中都不需要加入<beanMapping>或者是<typeMapping>的聲明。

          2)簡單的javabean對象類型。
                 對于簡單的javabean對象, 比如對象中所有的field都是上面提到的基本類型。 axis1.2也提供了很好的支持。
                 比如:
                 public class JavaBeanInputService { 
                     public void testJavaBeanInput(MyBean bean) {
                         ......
                    }
                 }
                  由于MyBean是一個自定義的JavaBean對象, 所以在server-config.wsdd中就必須加上<beanMapping ...../>的聲明, 讓axis知道怎么把request中xml數據deserialize為MyBean對象, 又如何把MyBean對象serialize為xml數據作為response.用wtp自動為JavaInputService生成的wsdl中, MyBean是作為一個complexType在wsdl中定義的。

          3)復雜一點的JavaBean對象。
                  比如JavaBean對象中的一些field又是自定義的JavaBean,  這種情況下, wsdl中生成的complextype會有多個, 而在wsdd定義的<beanMapping .../>也會有多個, axis1.2支持起來都是易如反掌。

          4)普通的非javabean對象。
                對于一些不是javaBean的對象, wtp也會替你生成對應的wsdl的ComplexType, 依據的是對象的getter方法。但是顯然這是不夠的。 比如說有些對象的數據結構比較復雜, 像java.util.HashMap(雖然這個已經被axis內在支持了。)這些對象如果想要把自己的狀態進行serialization和deserialization, 就得自己編寫serializer和deserializer,  而且還必須保證wsdl中的該complexType的描述是正確的。

          5)java中的List, Map問題。
                 試想一下如果一個service的樣子是這樣子的。
                 public class ListService{
                       public List listTest(List list) {
                              for(Iterator iter = list.iterator(); iter.hasNext(); ) {
                                     (MyBean)list.next();//進行強轉。
                              }
                        }
                 }
                  用wtp為這個service生成的wsdl中把list映射為一個type為xsd:anyType的maxOccurs="unbound"的complexType。這樣的話客戶端生成的Stub中的接口中類似于:
                  public interface ListService{
                       public Object[] listTest(Object[] list) ;
                  }
                  如果Client端用戶傳遞的入口參數是String[],那么在服務端執行的必然會發生轉型錯誤。
                  因此,在webservice中把List, Map作為service的input, output的做法都是不可行的。至少在jdk1.4的版本中是這樣的。
                 
          一個更好的方法就是:

          6)java中的數組。
                上例中的ListService如果改造為下面這樣,基本上就沒有上面提到的問題了。
                public class ListService{
                       public MyBean[] listTest(MyBean[] list) {
                             ...
                       }
                 }
                 這樣在wsdl中, MyBean被映射為一種ComplexType,MyBean[]為映射為ComplexType為映射為可以重復出現的MyBean類型。在客戶端的Stub的接口跟這個也是類似的。從而也成功地避免了List, Map中型別問題。
                 要注意的是,在server-config.wsdd中需要配置<arrayMapping.../>
                 似乎List, Map的問題用數組就可以解決了。事實上就是如此。但是還得注意的是:
             javabean里邊也不能含有List. 如果MyBean跟其它某個對象是1:n的關系,那么也只能寫成數組的形式,而不能是List的形式。

          7)特殊對象java.lang.Object
                 如果一個service寫成了下面的形式:
                 public class ObjectService{
                       public Object objInvoke(Object obj) {
                             ...
                       }
                 }
                  想把它發布為web service, 那么幾乎是不太可能的。遇到obj類型,wsdl里邊只能定義為xsd:anyType類型,而這種類型如果給客戶端返回一個比如MyBean類型,那么必然會導致xml的serialization的失敗。結論就是:
                  web service中如果input 或者是output是java.lang.Object類型,那么將會導致嚴重問題。

                 
                 
          上面的幾種對象類型基本上能夠涵蓋將java class發布為web service時需要考慮的對象類型。可以看到開發web service的時候,并不是所有的java都能夠輕而易舉地發布為web service, 一些復雜的類的對象類型,還有一些特殊的對象類型都是要考慮的。最后一個問題是:子類是否也很容易的得到序列化和反序列化?
                   答案是肯定的。如下的Service:
                    public class PolymorphicService{
                       public MyBean objInvoke(MyBean obj) {
                             ...
                       }
                   }
                    客戶端的Stub如下:
                    public class PolymorphicServiceStub{
                       public MyBean objInvoke(MyBean obj) {
                             ...
                       }
                   }
                   如果在客戶端調用stub時傳入的不是MyBean類的對象,而是它的子類的一個對象,那么也可以被序列化而傳到服務端。同樣,如果服務端返回的對象是MyBean類的字類的一個對象,也可以成功的被序列化到客戶端。

          posted @ 2008-04-10 14:14 Live-in Java 閱讀(5523) | 評論 (1)編輯 收藏

            服務器端定義:

          public class TestService {
           
           public String getStr(String input) {
            return "Input string:"+input;
           }
           
           public Bean getBean(Bean bean) {
            System.out.println("Bean Name:"+bean.getName());
            bean.setName(bean.getName()+"OK");
            
            Bean bb = new Bean();
            bb.setName("haha");
            return bb;
           }
           
           public Bean[] getBeans(String str) {
            Bean[] rets = new  Bean[2];
            Bean bean1 = new Bean();
            bean1.setName("name 1");
            Bean bean2 = new Bean();
            bean2.setName("name 2");
            
            rets[0] = bean1;
            rets[1] = bean2;
            return rets;
           }

          }





          server-config.wsdd中的配置:

          自定義類
          <typeMapping deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory" encodingStyle="" qname="ns6:Bean" serializer="org.apache.axis.encoding.ser.BeanSerializerFactory" type="java:com.test.bean.Bean" xmlns:ns6="http://bean.test.com"/>

          數組
          <typeMapping xmlns:ns7="http://bean.test.com" qname="ns7:ArrayOf_Bean" type="java:com.test.bean.Bean[]" serializer="org.apache.axis.encoding.ser.ArraySerializerFactory" deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory" encodingStyle="" /> 

          客戶端調用:
                    String endpoint = "http://localhost:8081/axistest/services/TestService";

                      Service service3 = new Service();
                      Call call3 = (Call) service3.createCall();
                      QName qn3 = new QName("http://bean.test.com","ArrayOf_Bean");
                      //注冊 bean
                      call3.registerTypeMapping(Bean.class,qn,new BeanSerializerFactory(Bean.class, qn),new BeanDeserializerFactory(Bean.class, qn));
                      call3.registerTypeMapping(Bean[].class,qn3,new BeanSerializerFactory(Bean[].class, qn3),new BeanDeserializerFactory(Bean[].class, qn3));
                      call3.setTargetEndpointAddress(new java.net.URL(endpoint));
                      call3.setOperationName(new QName("getBeans"));
                      call3.addParameter("arg1", qn, ParameterMode.IN);
             call3.setReturnType(qn,Bean.class);

             java.util.ArrayList ret3 = (java.util.ArrayList) call3.invoke(new Object[] {"test--"});
                      System.out.println((ret3==null)?"null":(""+ret3.size())); 


           
          posted @ 2008-04-01 16:07 Live-in Java 閱讀(550) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 五大连池市| 巴林右旗| 华阴市| 城口县| 安义县| 岳阳县| 兰西县| 交口县| 宝兴县| 康保县| 桑植县| 改则县| 廊坊市| 新乡县| 文安县| 江都市| 贵港市| 白玉县| 察哈| 白山市| 东山县| 洛宁县| 惠来县| 云南省| 陇川县| 华宁县| 浦城县| 曲阳县| 沙湾县| 共和县| 来宾市| 浏阳市| 黑河市| 宕昌县| 南溪县| 白山市| 佛山市| 扎鲁特旗| 柳江县| 大化| 金山区|