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

資訊專欄INFORMATION COLUMN

實現(xiàn)一個spring webservice服務(wù)端三:實現(xiàn)一個有復(fù)雜返回值的spring-ws服務(wù)

xinhaip / 3170人閱讀

摘要:,將類或枚舉類型映射到模式類型,控制字段或?qū)傩缘男蛄谢1硎緦⒆詣咏壎愔械拿總€非靜態(tài)的非瞬態(tài)的由標(biāo)注字段到。,對于數(shù)組或集合即包含多個元素的成員變量,生成一個包裝該數(shù)組或集合的元素稱為包裝器。

在經(jīng)過前面兩篇文章的學(xué)習(xí),我已經(jīng)能夠熟練創(chuàng)建一個正常運行的spring-ws的webservice服務(wù),大多數(shù)接口,都是要有返回數(shù)據(jù),所以這篇文章就是學(xué)習(xí)spring-ws怎么實現(xiàn)返回數(shù)據(jù)

實現(xiàn)一個常規(guī)的返回數(shù)據(jù)

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

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

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

修改代碼:
加上注解

@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 測試結(jié)果:


   
   
      
         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?
      
   

后臺輸出結(jié)果:

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

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

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

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

wsdl:portType name="HumanResource">




也就是說,spring-ws會查找名字為Holiday參數(shù)為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;
    }
}

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


   
   
      
         中華田園犬
         5
      
   

總而言之,現(xiàn)在得到返回值了。

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

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

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

此時,再次查看生成的wsdl文件,發(fā)現(xiàn)并不是我想象中的樣子:

···


   
     
   


···

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

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(因此,標(biāo)記)通過使用約定從XSD模式構(gòu)建WSDL。
它迭代在模式中找到的所有元素元素,并為所有元素創(chuàng)建一條消息。 接下來,它為所有以定義的請求或響應(yīng)后綴結(jié)尾的消息創(chuàng)建WSDL操作。
默認請求后綴為Request; 默認響應(yīng)后綴為Response,但可以通過在/>上分別設(shè)置requestSuffix和responseSuffix屬性來更改。 它還基于操作構(gòu)建portType,綁定和服務(wù)。

也就是說,只有帶有指定的后綴,才能正確的生成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、現(xiàn)在的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結(jié)果如下:


   
      
   
   
      
   

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

繼續(xù)修改,把DogResponse,改成HolidayResponse,修改后,重新測試,結(jié)果如下:


  
    
    
  

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


  
     
     
  

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

把名字改回HolidayRequest和HolidayResponse, 現(xiàn)在生成wsdl沒有錯誤了,那繼續(xù)測試soap ui。

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


  
    
  

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


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

應(yīng)該是我改代碼的時候,誤刪了。加回來繼續(xù)測試,測試請求如下:


   
   
      
         旺財
      
   

返回的信息是:


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

明顯可以看出報錯了,百度了一下,看到有人說,要在請求參數(shù)上,所有的請求參數(shù)的元素加上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;
    }
}

重新測試,結(jié)果如下:


   
   
      
         中華田園犬
         5
      
   
總結(jié)

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

總得來講,經(jīng)過這一段閑暇時間的學(xué)習(xí)對webservice相關(guān)的概念,對spring-ws相關(guān)的配置,算是有了比較直觀充分地了解。

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

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70165.html

相關(guān)文章

  • 實現(xiàn)一個spring webservice服務(wù)端四:服務(wù)端、客戶端以及httpclient調(diào)用spr

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

    oneasp 評論0 收藏0
  • 實現(xiàn)一個spring webservice服務(wù)端二:創(chuàng)建一個可以訪問的webservice

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

    Arno 評論0 收藏0
  • Java系統(tǒng)WebServiceSpring與CXF的集成

    摘要:我們再使用這樣的來查看這個服務(wù)具體的定義這個用以通過查看服務(wù)也就是我們開頭所說的用通用格式來描述的功能入?yún)⒑头祷刂担刮覀兊恼{(diào)用者明白服務(wù)的使用方法具體詳情可以查看我們的這個服務(wù)的頁面。 WebService是什么呢?顧名思義,是Web系統(tǒng)提供的服務(wù),其目的呢,往大了說:是系統(tǒng)實現(xiàn)多異構(gòu)模塊協(xié)同合作,服務(wù)實現(xiàn)SOA(Services oriented Architecture面向服務(wù)的...

    waterc 評論0 收藏0
  • spring boot開發(fā)soap webservice

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

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

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

    rozbo 評論0 收藏0

發(fā)表評論

0條評論

xinhaip

|高級講師

TA的文章

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