成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

xinhaip / 3173人閱讀

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

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

實(shí)現(xiàn)一個(gè)常規(guī)的返回?cái)?shù)據(jù)

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

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

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

修改代碼:
加上注解

@PayloadRoot(namespace = NAMESPACE_URI, localPart = "HolidayRequest")
    @ResponsePayload
    public Dog handleHolidayRequest(@RequestPayload Element holidayRequest) throws Exception {
    
        System.out.println("請(qǐng)求進(jìn)來(lái)了");
        
        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;
    }

第一個(gè)返回類:

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;
    }

啟動(dòng)測(cè)試,soap ui 測(cè)試結(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?
      
   

后臺(tái)輸出結(jié)果:

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

沒(méi)有輸出信息,可以看出請(qǐng)求根本沒(méi)有進(jìn)來(lái)

從錯(cuò)誤信息,可以看到適配到返回值為Dog的端點(diǎn),這么說(shuō)來(lái),肯定是我配錯(cuò)了。

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

wsdl:portType name="HumanResource">




也就是說(shuō),spring-ws會(huì)查找名字為Holiday參數(shù)為HolidayRequest,返回值為void的方法,所以找不到我寫(xiě)的,可是按理說(shuō),我既然寫(xiě)返回值了,為什么生成還沒(méi)有返回值的port。
我突然想到,上面寫(xiě)的那個(gè)返回值支持類型,我寫(xiě)的dog好像不是表格中任何一種類型,因?yàn)槲抑粚?duì)jaxb2有點(diǎn)印象,所以就按照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è)注釋和一個(gè)空構(gòu)造方法,先不解釋,看一下測(cè)試結(jié)果:


   
   
      
         中華田園犬
         5
      
   

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

因?yàn)槲矣玫氖莏dk自帶的jaxb2,所以不需要增加額外的jar包就可以使用,這個(gè)jar包提供了一下幾個(gè)注釋用于xml和對(duì)象的轉(zhuǎn)化,我從網(wǎng)上找了一段感覺(jué)非常不錯(cuò)的說(shuō)明:

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

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

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

···


   
     
   


···

soap UI 測(cè)試都返回?cái)?shù)據(jù)了,為什么wsdl文件上卻沒(méi)有返回值,不知道該搜索什么,只好去看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)記)通過(guò)使用約定從XSD模式構(gòu)建WSDL。
它迭代在模式中找到的所有元素元素,并為所有元素創(chuàng)建一條消息。 接下來(lái),它為所有以定義的請(qǐng)求或響應(yīng)后綴結(jié)尾的消息創(chuàng)建WSDL操作。
默認(rèn)請(qǐng)求后綴為Request; 默認(rèn)響應(yīng)后綴為Response,但可以通過(guò)在/>上分別設(shè)置requestSuffix和responseSuffix屬性來(lái)更改。 它還基于操作構(gòu)建portType,綁定和服務(wù)。

也就是說(shuō),只有帶有指定的后綴,才能正確的生成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("請(qǐng)求進(jìn)來(lái)了");
    
    
        DogResponse dogResponse = new DogResponse();
        dogResponse.setName("中華田園犬");
        dogResponse.setAge(5);
        
        return dogResponse;
    }

重啟測(cè)試,新生成的wsdl結(jié)果如下:


   
      
   
   
      
   

soap ui 測(cè)試結(jié)果仍然是對(duì)的,生成的wsdl仍然是錯(cuò)的;

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


  
    
    
  

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


  
     
     
  

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

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

但是很不幸是,soap ui測(cè)試無(wú)法通過(guò)了,因?yàn)樯傻膕ervice是這樣的:


  
    
  

測(cè)試時(shí),認(rèn)為我的訪問(wèn)路徑是/holidayService/,這樣肯定是無(wú)法訪問(wèn)的,因?yàn)檫@個(gè)location是相對(duì)路徑,需要?jiǎng)討B(tài)轉(zhuǎn)化為真實(shí)路徑,需要在web.xml中配置下面的init內(nèi)容,如下:


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

應(yīng)該是我改代碼的時(shí)候,誤刪了。加回來(lái)繼續(xù)測(cè)試,測(cè)試請(qǐng)求如下:


   
   
      
         旺財(cái)
      
   

返回的信息是:


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

明顯可以看出報(bào)錯(cuò)了,百度了一下,看到有人說(shuō),要在請(qǐng)求參數(shù)上,所有的請(qǐng)求參數(shù)的元素加上namespace,于是改成下面這個(gè)樣子:

@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;
    }
}

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


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

剛開(kāi)始覺(jué)得挺簡(jiǎn)單的,下載下來(lái)spring-ws的demo,非常順利的運(yùn)行起來(lái)了,可是自己搞一遍的時(shí)候,錯(cuò)誤百出,網(wǎng)上搜索的話,大多是求解決方法的,很少有提出有用的解決方案的,在上面,我把自己的解決過(guò)程寫(xiě)了出來(lái),希望對(duì)和我一樣剛開(kāi)始學(xué)這個(gè)東西的朋友有點(diǎn)幫助。

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

這是我的最終修改的項(xiàng)目,發(fā)布出來(lái)的的路徑,測(cè)試wsdl鏈接。

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70165.html

相關(guān)文章

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

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

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

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

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

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

    waterc 評(píng)論0 收藏0
  • spring boot開(kāi)發(fā)soap webservice

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

    Ashin 評(píng)論0 收藏0
  • Java 遠(yuǎn)程通訊技術(shù)及原理分析

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

    rozbo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<