javascript
oracle json入参调用ws服务返回请求失败_Spring 5.2.2技术集成 —Spring HTTP调用程序和JAXWS...
? ? ? ? 下面提到的AccountService接口類需要看Spring 5.2.2 技術(shù)的集成—RMI、Hessian,就不在此贅述了。
一、Spring HTTP調(diào)用程序
? ? ? 與Hessian相反,Spring HTTP 調(diào)用程序都是輕量級(jí)協(xié)議,它們使用自己的便捷的序列化機(jī)制,并使用標(biāo)準(zhǔn)Java序列化機(jī)制通過(guò)HTTP公開(kāi)服務(wù)。如果參數(shù)和返回類型是無(wú)法使用Hessian使用的序列化機(jī)制進(jìn)行序列化的復(fù)雜類型,則這有很大的優(yōu)勢(shì)。
? ? 其實(shí)是Spring使用JDK或Apache?HttpComponents提供的標(biāo)準(zhǔn)工具來(lái)執(zhí)行HTTP調(diào)用。如果你需要更高級(jí)、更易于使用的功能,請(qǐng)使用后者。
? ? ?請(qǐng)注意由于不安全的Java反序列化導(dǎo)致的漏洞:在反序列化步驟中,被操縱的輸入流可能導(dǎo)致服務(wù)器上執(zhí)行不需要的代碼。因此,不要向不受信任的客戶端公開(kāi)HTTP調(diào)用程序端點(diǎn)。相反,只在您自己的服務(wù)之間公開(kāi)它們。一般來(lái)說(shuō),我們強(qiáng)烈建議使用其他任何消息格式(如JSON)。
? ??如果你擔(dān)心Java序列化導(dǎo)致的安全漏洞,請(qǐng)考慮核心JVM級(jí)別的通用序列化filter 機(jī)制,該機(jī)制最初是為JDK 9開(kāi)發(fā)的,但同時(shí)移植到JDK 8、7和6。
1、暴露服務(wù)對(duì)象
? ? ?為服務(wù)對(duì)象設(shè)置HTTP 調(diào)用程序與使用Hessian進(jìn)行相同操作的方式非常相似。由于Hessian支持提供HessianServiceExporter,Spring的HttpInvoker支持提供org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter。
? ? ??要在Spring Web MVC DispatcherServlet中暴露AccountService?(前面提到過(guò),Spring 5.2.2 技術(shù)的集成—RMI、Hessian),需要在調(diào)度器的應(yīng)用程序上下文中設(shè)置以下配置,如下例所示:
"/AccountService" <property name="service" ref="accountService"/> <property name="serviceInterface" value="example.AccountService"/>bean>這樣的暴露服務(wù)定義通過(guò)DispatcherServlet?實(shí)例的標(biāo)準(zhǔn)映射工具公開(kāi)。或者,可以在根應(yīng)用程序上下文(例如,在“WEB-INF”中)中創(chuàng)建HttpInvokerServiceExporter?在'WEB-INF/applicationContext.xml''),如下例所示:
"accountExporter" <property name="service" ref="accountService"/> <property name="serviceInterface" value="example.AccountService"/>bean>此外,你可以在中為此暴露服務(wù)定義相應(yīng)的servlet??web.xml文件,servlet名稱與目標(biāo)暴露服務(wù)的bean名稱匹配,如下例所示:
<servlet> <servlet-name>accountExporterservlet-name> <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServletservlet-class>servlet><servlet-mapping> <servlet-name>accountExporterservlet-name> <url-pattern>/remoting/AccountServiceurl-pattern>servlet-mapping>2、客戶端鏈接服務(wù)
? ? ?同樣,從客戶端鏈接服務(wù)與使用Hessian時(shí)的方式非常相似。通過(guò)使用代理,Spring可以將你對(duì)HTTP POST請(qǐng)求的調(diào)用轉(zhuǎn)換為指向暴露服務(wù)的URL。以下示例顯示如何配置此排列:
"httpInvokerProxy" <property name="serviceUrl" value="https://remotehost:8080/remoting/AccountService"/> <property name="serviceInterface" value="example.AccountService"/>bean>如前所述,你可以選擇要使用的HTTP客戶端。默認(rèn)情況下,HttpInvokerProxy?使用JDK的HTTP功能,但是你也可以通過(guò)設(shè)置httpInvokerRequestExecutor?屬性來(lái)使用Apache? HttpComponents?客戶端。下面的示例演示如何執(zhí)行此操作:
<property name="httpInvokerRequestExecutor"> <bean class="org.springframework.remoting.httpinvoker.HttpComponentsHttpInvokerRequestExecutor"/>property>二、Java Web服務(wù)
Spring完全支持標(biāo)準(zhǔn)Java web services API:
使用JAX-WS暴露web服務(wù)
使用JAX-WS訪問(wèn)web服務(wù)
除了?Spring Core中對(duì)JAX-WS的支持外,Spring portfolio?還提供了SpringWeb服務(wù),它是協(xié)議優(yōu)先、文檔驅(qū)動(dòng)的Web服務(wù)的解決方案,強(qiáng)烈推薦用于構(gòu)建現(xiàn)代的、面向未來(lái)的Web服務(wù)。
1、使用JAX-WS暴露基于Servlet的Web服務(wù)
? ?Spring為JAX-WS servlet實(shí)現(xiàn)提供了一個(gè)方便的基類:SpringBeanAutowiringSupport。為了暴露AccountService,我們擴(kuò)展了Spring的SpringBeanAutowiringSupport?類,并在這里實(shí)現(xiàn)業(yè)務(wù)邏輯,通常將調(diào)用委托給業(yè)務(wù)層。我們使用Spring的@Autowired注解來(lái)表達(dá)對(duì)Spring托管bean的依賴性。將SpringBeanAutowiringSupport繼承到以下示例:
/** * 符合JAX-WS的AccountService實(shí)現(xiàn),它簡(jiǎn)單地委托給根?* web應(yīng)用程序上下文中的實(shí)現(xiàn)AccountService。 *?*?這個(gè)封裝類是必需的,因?yàn)镴AX-WS需要使用專用的類。如果需要暴露?*?現(xiàn)有服務(wù),那么繼承springbeanautowringsupport的封裝器(通過(guò)?*?@Autowired注解)是最簡(jiǎn)單的JAX-WS兼容方式。 * *?*這是在服務(wù)器端JAX-WS實(shí)現(xiàn)中注冊(cè)的類。對(duì)于java服務(wù)器,這將簡(jiǎn)單 * 地定義為web.xml文件,服務(wù)器檢測(cè)到這是一個(gè)JAX-WS端點(diǎn)并作出相應(yīng)?*?的響應(yīng)。servlet名稱通常需要與指定的WS-service名稱匹配 *?* web服務(wù)引擎管理此類實(shí)例的生命周期。SpringBean引用將被連接到這里 */import org.springframework.web.context.support.SpringBeanAutowiringSupport;@WebService(serviceName="AccountService")public class AccountServiceEndpoint extends SpringBeanAutowiringSupport { @Autowired private AccountService biz; @WebMethod public void insertAccount(Account acc) { biz.insertAccount(acc); } @WebMethod public Account[] getAccounts(String name) { return biz.getAccounts(name); }}我們的AccountServiceEndpoint?需要在與Spring上下文相同的web應(yīng)用程序中運(yùn)行,以允許訪問(wèn)Spring的結(jié)構(gòu)。在java環(huán)境中,這是默認(rèn)情況,使用JAX-ws ?servlet部署的標(biāo)準(zhǔn)協(xié)議。
2、使用JAX-WS導(dǎo)出獨(dú)立的Web服務(wù)
? ? Oracle JDK附帶的內(nèi)置JAX-WS提供程序通過(guò)使用JDK中包含的內(nèi)置HTTP服務(wù)器來(lái)支持web服務(wù)的公開(kāi)。Spring的SimpleJaxWsServiceExporter?檢測(cè)Spring應(yīng)用程序上下文中所有帶@WebService注解的bean,并通過(guò)默認(rèn)的JAX-WS服務(wù)器(jdk ?http服務(wù)器)暴露它們。
? ??在這個(gè)場(chǎng)景中,端點(diǎn)實(shí)例被定義和管理為Spring beans?本身。它們?cè)贘AX-WS引擎中注冊(cè),但它們的生命周期取決于Spring應(yīng)用程序上下文。這意味著你可以將Spring功能(例如依賴注入)應(yīng)用于端點(diǎn)實(shí)例。通過(guò)@Autowired的注解驅(qū)動(dòng)注入也可以工作。下面的示例演示如何定義這些bean:
class= <property name="baseAddress" value="http://localhost:8080/"/>bean>"accountServiceEndpoint" ...</bean>? ??AccountServiceEndpoint?可以但不必從Spring的SpringBeanAutowiringSupport派生,因?yàn)楸纠械亩它c(diǎn)是一個(gè)完全由Spring管理的bean。這意味著端點(diǎn)實(shí)現(xiàn)可以如下所示(沒(méi)有聲明任何超類?,Spring的@Autowired配置注解仍然適用):
@WebService(serviceName="AccountService")public class AccountServiceEndpoint { @Autowired private AccountService biz; @WebMethod public void insertAccount(Account acc) { biz.insertAccount(acc); } @WebMethod public ListgetAccounts(String name) { return biz.getAccounts(name); }}3、使用JAX-WS?RI的Spring支持暴露Web服務(wù)
? ? ?作為GlassFish項(xiàng)目的一部分開(kāi)發(fā)的Oracle的JAX-WS RI將Spring支持作為其JAX-WS commons項(xiàng)目的一部分提供。這允許將JAX-WS端點(diǎn)定義為Spring托管bean,類似于上一節(jié)討論的獨(dú)立模式,但這次是在Servlet環(huán)境中。
? ??與暴露基于servlet的端點(diǎn)的標(biāo)準(zhǔn)樣式的不同之處在于,端點(diǎn)實(shí)例本身的生命周期由Spring管理,并且只有一個(gè)JAX-WS servlet在中定義web.xml文件. 使用標(biāo)準(zhǔn)java樣式(如前所示),每個(gè)服務(wù)端點(diǎn)都有一個(gè)servlet定義,每個(gè)端點(diǎn)通常委托給spring ?bean(通過(guò)使用@Autowired,如前所示)。
4、使用JAX-WS訪問(wèn)Web服務(wù)
? ? Spring提供了兩個(gè)工廠bean來(lái)創(chuàng)建JAX-WS web服務(wù)代理,即localjaxwsserviceactorybean和JaxWsPortProxyFactoryBean。前者只能返回一個(gè)JAX-WS服務(wù)類供我們使用。后者是完整的版本,可以返回實(shí)現(xiàn)業(yè)務(wù)服務(wù)接口的代理。在下面的示例中,我們使用JaxWsPortProxyFactoryBean為AccountService端點(diǎn)創(chuàng)建一個(gè)代理(同樣):
"accountWebService" "serviceInterface" "wsdlDocumentUrl" "namespaceUri" "serviceName" "portName"?wsdlDocumentUrl?是WSDL文件的URL。Spring需要在啟動(dòng)時(shí)使用它來(lái)創(chuàng)建JAX-WS服務(wù)。namespaceUri?對(duì)應(yīng)于.wsdl文件中的targetNamespace?。serviceName?與.wsdl文件中的服務(wù)名稱相對(duì)應(yīng)。portName?對(duì)應(yīng)于.wsdl文件中的端口名。
? ??訪問(wèn)web服務(wù)很容易,因?yàn)槲覀優(yōu)樗峁┝艘粋€(gè)bean工廠,它將它暴露為一個(gè)名為AccountService的接口。下面的示例顯示了如何在Spring將其連接起來(lái):
"client" ... "service" ref=bean>從客戶端代碼中,我們可以像訪問(wèn)普通類一樣訪問(wèn)web服務(wù),如下例所示:
public class AccountClientImpl { private AccountService service; public void setService(AccountService service) { this.service = service; } public void foo() { service.insertAccount(...); }}?上面的內(nèi)容稍微簡(jiǎn)化了,因?yàn)镴AX-WS要求端點(diǎn)接口和實(shí)現(xiàn)類用@WebService、@SOAPBinding等注解進(jìn)行注解。這意味著你不能(輕松地)將純Java接口和實(shí)現(xiàn)類用作JAX-WS端點(diǎn)構(gòu)件;你需要首先對(duì)它們進(jìn)行相應(yīng)的注解。
喜歡朋友幫忙關(guān)注和轉(zhuǎn)發(fā)Spring中文社區(qū)(加微信群,關(guān)注后加我微信入群):
spring其它技術(shù)鏈接:
https://mp.weixin.qq.com/mp/homepage?__biz=MzI3NTA5NzE5Ng==&hid=1&sn=963b73ffeefe61185f5db07ebad1a489
https://mp.weixin.qq.com/mp/homepage?__biz=MzI3NTA5NzE5Ng==&hid=3&sn=f1b18efa59446d82a467c59b20ab09c8
https://mp.weixin.qq.com/mp/homepage?__biz=MzI3NTA5NzE5Ng==&hid=2&sn=68bdaaf874131498b834cbecd7f29f0e
https://mp.weixin.qq.com/mp/homepage?__biz=MzI3NTA5NzE5Ng==&hid=4&sn=7273de72ef95a01b1893e1f6151ab7de
https://mp.weixin.qq.com/mp/homepage?__biz=MzI3NTA5NzE5Ng==&hid=5&sn=3145fd46c816ff11f209881c96a51187
總結(jié)
以上是生活随笔為你收集整理的oracle json入参调用ws服务返回请求失败_Spring 5.2.2技术集成 —Spring HTTP调用程序和JAXWS...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个莫名的人,竞标,教训,韩国女人
- 下一篇: 异常重试_Spring-Retry重试实