国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

實現一個spring webservice服務端三:實現一個有復雜返回值的spring-ws服務

xinhaip / 3158人閱讀

摘要:,將類或枚舉類型映射到模式類型,控制字段或屬性的序列化。表示將自動綁定類中的每個非靜態的非瞬態的由標注字段到。,對于數組或集合即包含多個元素的成員變量,生成一個包裝該數組或集合的元素稱為包裝器。

在經過前面兩篇文章的學習,我已經能夠熟練創建一個正常運行的spring-ws的webservice服務,大多數接口,都是要有返回數據,所以這篇文章就是學習spring-ws怎么實現返回數據

實現一個常規的返回數據

一個接口返回的數據一般都是對象,那就看看怎么返回一個對象數據。

首先,還是要看spring-ws文檔的,在參考文檔端點一節,在這一節中,開始就提出了,要使用@ResponsePayload注解,實現返回數據。支持類型如下:

從上面表格可以看出,spring-ws的得demo中,使用的是jdom類型的,先不管其它類型,在此基礎上,實現一個返回值,

修改代碼:
加上注解

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "HolidayRequest")
    @ResponsePayload
    public Dog handleHolidayRequest(@RequestPayload Element holidayRequest) throws Exception {
    
        System.out.println("請求進來了");
        
        Date startDate = parseDate(startDateExpression, holidayRequest);
        Date endDate = parseDate(endDateExpression, holidayRequest);
        String name = firstNameExpression.evaluateFirst(holidayRequest).getText() + " " + lastNameExpression.evaluateFirst(holidayRequest).getText();
        
        humanResourceService.bookHoliday(startDate, endDate, name);
        
        Dog dog = new Dog("中華田園犬", 5);
        
        return dog;
    }

第一個返回類:

public class Dog {

    private String name;
    private Integer age;
    
    public Dog (String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName () {
        return name;
    }
    
    public void setName (String name) {
        this.name = name;
    }
    
    public Integer getAge () {
        return age;
    }
    
    public void setAge (Integer age) {
        this.age = age;
    }

啟動測試,soap ui 測試結果:


   
   
      
         SOAP-ENV:Server
         No adapter for endpoint [public com.nyl.learn.hr.model.Dog com.nyl.learn.hr.ws.HolidayEndpoint.handleHolidayRequest(org.jdom2.Element) throws java.lang.Exception]: Is your endpoint annotated with @Endpoint, or does it implement a supported interface like MessageHandler or PayloadEndpoint?
      
   

后臺輸出結果:

六月 19, 2017 6:08:13 下午 org.springframework.ws.transport.http.MessageDispatcherServlet initServletBean
信息: FrameworkServlet "spring-ws": initialization completed in 502 ms

沒有輸出信息,可以看出請求根本沒有進來

從錯誤信息,可以看到適配到返回值為Dog的端點,這么說來,肯定是我配錯了。

可是spring-ws的參考文檔上也沒說需要給Dog加注解或者實現某個類。
重新打開新生成wsdl文件,發現是這樣的:

wsdl:portType name="HumanResource">




也就是說,spring-ws會查找名字為Holiday參數為HolidayRequest,返回值為void的方法,所以找不到我寫的,可是按理說,我既然寫返回值了,為什么生成還沒有返回值的port。
我突然想到,上面寫的那個返回值支持類型,我寫的dog好像不是表格中任何一種類型,因為我只對jaxb2有點印象,所以就按照jaxb2類型修改,修改如下:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "dog")
public class Dog {

    
    private String name;
    private Integer age;
    
    public Dog () {
    }
    
    public Dog (String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName () {
        return name;
    }
    
    public void setName (String name) {
        this.name = name;
    }
    
    public Integer getAge () {
        return age;
    }
    
    public void setAge (Integer age) {
        this.age = age;
    }
}

相比前面,多了兩個注釋和一個空構造方法,先不解釋,看一下測試結果:


   
   
      
         中華田園犬
         5
      
   

總而言之,現在得到返回值了。

因為我用的是jdk自帶的jaxb2,所以不需要增加額外的jar包就可以使用,這個jar包提供了一下幾個注釋用于xml和對象的轉化,我從網上找了一段感覺非常不錯的說明:

JAXBContext類,是應用的入口,用于管理XML/Java綁定信息。
Marshaller接口,將Java對象序列化為XML數據。
Unmarshaller接口,將XML數據反序列化為Java對象。
 
@XmlType,將Java類或枚舉類型映射到XML模式類型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或屬性的序列化。FIELD表示JAXB將自動綁定Java類中的每個非靜態的(static)、非瞬態的(由@XmlTransient標 注)字段到XML。其他值還有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 綁定類中屬性和字段的排序。
@XmlJavaTypeAdapter,使用定制的適配器(即擴展抽象類XmlAdapter并覆蓋marshal()和unmarshal()方法),以序列化Java類為XML。
@XmlElementWrapper ,對于數組或集合(即包含多個元素的成員變量),生成一個包裝該數組或集合的XML元素(稱為包裝器)。
@XmlRootElement,將Java類或枚舉類型映射到XML元素。
@XmlElement,將Java類的一個屬性映射到與屬性同名的一個XML元素。
@XmlAttribute,將Java類的一個屬性映射到與屬性同名的一個XML屬性。

原文是個博客,地址為這里,有興趣的可以看看。

此時,再次查看生成的wsdl文件,發現并不是我想象中的樣子:

···


   
     
   


···

soap UI 測試都返回數據了,為什么wsdl文件上卻沒有返回值,不知道該搜索什么,只好去看spring-ws的參考文檔,最終在這一節找到了答案:

The DefaultWsdl11Definition (and therefore, the tag) builds a WSDL from a XSD schema by using conventions. It iterates over all element elements found in the schema, and creates a message for all elements. Next, it creates WSDL operation for all messages that end with the defined request or response suffix. The default request suffix is Request; the default response suffix is Response, though these can be changed by setting the requestSuffix and responseSuffix attributes on , respectively. It also builds a portType, binding, and service based on the operations.

谷歌翻譯成中文是:

DefaultWsdl11Definition(因此,標記)通過使用約定從XSD模式構建WSDL。
它迭代在模式中找到的所有元素元素,并為所有元素創建一條消息。 接下來,它為所有以定義的請求或響應后綴結尾的消息創建WSDL操作。
默認請求后綴為Request; 默認響應后綴為Response,但可以通過在/>上分別設置requestSuffix和responseSuffix屬性來更改。 它還基于操作構建portType,綁定和服務。

也就是說,只有帶有指定的后綴,才能正確的生成wsdl文件,那么再改一下代碼,如下:

1、把Dog類改成DogResponse

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DogResponse")
@XmlType(name = "", propOrder = {
        "name","age"
})
public class DogResponse {
    
    @XmlElement(required = true)
    protected String name;
    
    protected Integer age;
    
    
    
    public String getName () {
        return name;
    }
    
    public void setName (String name) {
        this.name = name;
    }
    
    public Integer getAge () {
        return age;
    }
    
    public void setAge (Integer age) {
        this.age = age;
    }
}

2、xsd修改




    
        
            
                
            
        
    

    
        
            
                
            
        
    


3、現在的HolidayEndpoint是這樣的:

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "holidayRequest")
    @ResponsePayload
    public DogResponse handleHolidayRequest(@RequestPayload HolidayRequest holidayRequest) throws Exception {
    
        System.out.println("請求進來了");
    
    
        DogResponse dogResponse = new DogResponse();
        dogResponse.setName("中華田園犬");
        dogResponse.setAge(5);
        
        return dogResponse;
    }

重啟測試,新生成的wsdl結果如下:


   
      
   
   
      
   

soap ui 測試結果仍然是對的,生成的wsdl仍然是錯的;

繼續修改,把DogResponse,改成HolidayResponse,修改后,重新測試,結果如下:


  
    
    
  

終于生成的是正確的wsdl文件了,現在我把HolidayRequest和HolidayResponse都改成DogRequest和DogResponse,再測試一下,結果如下:


  
     
     
  

可以看出,請求和返回的名字是有要求的,兩個名字前面要一樣,后綴分別是固定的配置,默認為Request和Response;

把名字改回HolidayRequest和HolidayResponse, 現在生成wsdl沒有錯誤了,那繼續測試soap ui。

但是很不幸是,soap ui測試無法通過了,因為生成的service是這樣的:


  
    
  

測試時,認為我的訪問路徑是/holidayService/,這樣肯定是無法訪問的,因為這個location是相對路徑,需要動態轉化為真實路徑,需要在web.xml中配置下面的init內容,如下:


    spring-ws
    org.springframework.ws.transport.http.MessageDispatcherServlet
    
      transformWsdlLocations
      true
    
  

應該是我改代碼的時候,誤刪了。加回來繼續測試,測試請求如下:


   
   
      
         旺財
      
   

返回的信息是:


   
   
      
         SOAP-ENV:Server
         意外的元素 (uri:"http://mycompany.com/hr/webservice", local:"holidayRequest")。所需元素為<{}holidayRequest>
      
   

明顯可以看出報錯了,百度了一下,看到有人說,要在請求參數上,所有的請求參數的元素加上namespace,于是改成下面這個樣子:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "name"
})
@XmlRootElement(name = "holidayRequest", namespace = "http://mycompany.com/hr/webservice")
public class HolidayRequest {
    
    @XmlElement(namespace = "http://mycompany.com/hr/webservice")
    protected String name;
    
    public String getName () {
        return name;
    }
    
    public void setName (String name) {
        this.name = name;
    }
}

重新測試,結果如下:


   
   
      
         中華田園犬
         5
      
   
總結

剛開始覺得挺簡單的,下載下來spring-ws的demo,非常順利的運行起來了,可是自己搞一遍的時候,錯誤百出,網上搜索的話,大多是求解決方法的,很少有提出有用的解決方案的,在上面,我把自己的解決過程寫了出來,希望對和我一樣剛開始學這個東西的朋友有點幫助。

總得來講,經過這一段閑暇時間的學習對webservice相關的概念,對spring-ws相關的配置,算是有了比較直觀充分地了解。

這是我的最終修改的項目,發布出來的的路徑,測試wsdl鏈接。

源碼,我放到碼云上了,路徑為:https://git.oschina.net/thewa...,有需要的可以下載下來看看。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70165.html

相關文章

  • 實現一個spring webservice服務端四:服務端、客戶端以及httpclient調用spr

    摘要:執行結果如下中華田園犬測試我認為所有使用協議的,都能使用測試。下面是我寫的測試代碼旺財需要增加一個包測試結果返回值如下中華田園犬寫法稍微有點麻煩的是,需要拼接請求參數,參數少的話還好,多的話就很煩不過這種方法不用生成一大堆客戶端代碼。 經過前段時間的學習,已經實現一個有返回值的spring-ws服務,那接下來,就要試試能不能通過不同方式的調用,要實現一下幾種方式的測試: spring...

    oneasp 評論0 收藏0
  • 實現一個spring webservice服務端二:創建一個可以訪問的webservice

    摘要:把上一篇文章生成的文件另存為,放到下面,沒有改,文件也沒有修改,只有配置文件改成了下面這個樣子按照文檔說明,此時訪問就可以訪問了。 在文章中,我學習了spring-ws基本的知識,在文章最后我也實現一個簡單的項目,訪問可以看到wsdl文件,但是我也遇到了一個問題,無法通過soap UI的測試,經過這一段業余時間的學習,這個問題解決。 這是上一個學習創建的項目的demo演示鏈接,打開可以...

    Arno 評論0 收藏0
  • Java系統WebServiceSpring與CXF的集成

    摘要:我們再使用這樣的來查看這個服務具體的定義這個用以通過查看服務也就是我們開頭所說的用通用格式來描述的功能入參和返回值,使我們的調用者明白服務的使用方法具體詳情可以查看我們的這個服務的頁面。 WebService是什么呢?顧名思義,是Web系統提供的服務,其目的呢,往大了說:是系統實現多異構模塊協同合作,服務實現SOA(Services oriented Architecture面向服務的...

    waterc 評論0 收藏0
  • spring boot開發soap webservice

    摘要:本文介紹如何在中開發接口,以及接口如何同時支持和兩種協議。該功能很簡單,就是通過一個人的姓名查詢這個人的詳細信息。就是關鍵,如本次請求報文如下就是,對應。測試使用進行測試,通過地址導入文件進行測試。測試這樣就實現了和同時提供的目的。 介紹spring boot web模塊提供了RestController實現restful,第一次看到這個名字的時候以為還有SoapController,...

    Ashin 評論0 收藏0
  • Java 遠程通訊技術及原理分析

    摘要:對于與而言,則可以看做是消息傳遞技術的一種衍生或封裝。在生產者通知消費者時,傳遞的往往是消息或事件,而非生產者自身。通過消息路由,我們可以配置路由規則指定消息傳遞的路徑,以及指定具體的消費者消費對應的生產者。采用和來進行遠程對象的通訊。 消息模式 歸根結底,企業應用系統就是對數據的處理,而對于一個擁有多個子系統的企業應用系統而言,它的基礎支撐無疑就是對消息的處理。與對象不同,消息本質上...

    rozbo 評論0 收藏0

發表評論

0條評論

xinhaip

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<