`

【翻译】Spring Web Services 2 - Part I

阅读更多
This is an introductory article, in a three part series which illustrates the use of Spring Web Services in a Java/J2EE Application.
All the Examples has been created by using Spring 3, Spring Web Services 2, JAX-WS, JAXB 2.2, and wsdl4j.jar

This Part will simplify the process of invoking a simple web service located at w3schools.com ( to convert a temperature from Celsius to Fahrenheit ).
Web Service URL is : http://www.w3schools.com/webservices/tempconvert.asmx
WSDL is : http://www.w3schools.com/webservices/tempconvert.asmx?wsdl

Note: Please use SOAP UI, an excellent tool for testing the web services.

So as per Spring WS Configuration, we will create a WebServiceTemplate which follows the same pattern as of JDBCTemplate, RestTemplate etc
So our application context (ac.xml) file in this case is:

<beans:beans xmlns:aop="http://www.springframework.org/schema/aop" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	       http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
	       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
	 
	 
	     
	    <beans:bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" id="messageFactory">
	     
	      
	     <beans:bean class="org.springframework.ws.client.core.WebServiceTemplate" id="webServiceTemplate">
	        <beans:constructor-arg ref="messageFactory">
	        <beans:property name="defaultUri" value="http://www.w3schools.com/webservices/tempconvert.asmx">
	        
	    </beans:property></beans:constructor-arg></beans:bean>
	 
	 
	</beans:bean></beans:beans>


Now we have to construct two Classes:
1. This Class will represent the java representation of the SOAP REQUEST BODY with all the tags defined through JAXB 2.2 framework. CelsiusToFahrenheit.java

package springws;
	 
	import javax.xml.bind.annotation.XmlElement;
	import javax.xml.bind.annotation.XmlRootElement;
	import javax.xml.bind.annotation.XmlType;
	 
	/**
	 *
	 * @author PankajB
	 * namespace represent the namespace of the elements, plz see wsdl for greater information
	 * CelsiusToFahrenheit is the Root Element name
	 */
	@XmlType(name="tem")
	@XmlRootElement(name="CelsiusToFahrenheit",namespace="http://tempuri.org/")
	public class CelsiusToFahrenheit {
	 
	    private int celsius;
	    
	 
	    @XmlElement(name="Celsius",namespace="http://tempuri.org/")
	    public int getCelsius() {
	        return celsius;
	    }
	 
	    public void setCelsius(int celsius) {
	        this.celsius = celsius;
	    }
	}


2. This class will represent the response that is coming from the Web service. CelsiusToFahrenheitResponse.java

package springws;
	 
	import javax.xml.bind.annotation.XmlElement;
	import javax.xml.bind.annotation.XmlRootElement;
	 
	 
	@XmlRootElement(name="CelsiusToFahrenheitResponse",namespace="http://tempuri.org/")
	public class CelsiusToFahrenheitResponse {
	 
	    private int result;
	 
	 
	    @XmlElement(name="CelsiusToFahrenheitResult",namespace="http://tempuri.org/")
	    public int getResult() {
	        return result;
	    }
	 
	    public void setResult(int result) {
	        this.result = result;
	    }
	}


Now the Final Part will be is to load the xml file and perform the invocation. The Source Code is easy to read, hence does not contain much comments (Sorry for this guys!!!)

Main.java
package springws;
	 
	import java.io.StringReader;
	import java.io.StringWriter;
	import javax.xml.bind.JAXBContext;
	import javax.xml.bind.Marshaller;
	import javax.xml.transform.stream.StreamResult;
	import javax.xml.transform.stream.StreamSource;
	import org.springframework.context.ApplicationContext;
	import org.springframework.context.support.ClassPathXmlApplicationContext;
	import org.springframework.ws.WebServiceMessage;
	import org.springframework.ws.client.core.WebServiceMessageCallback;
	import org.springframework.ws.client.core.WebServiceTemplate;
	import org.springframework.ws.soap.SoapMessage;
	 
	/**
	 *
	 * @author PankajB
	 */
	public class Main {
	 
	    
	    /**
	     * @param args the command line arguments
	     */
	    public static void main(String[] args) {
	 
	        try
	        {
	   // getting the file present in springws package
	        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springws/ac.xml");
	  // get the Bean
	        WebServiceTemplate webServiceTemplate = (WebServiceTemplate)applicationContext.getBean("webServiceTemplate");
	  // Create the Marshaller, so that we can generate the request SOAP Body XMl
	        JAXBContext jc= JAXBContext.newInstance(CelsiusToFahrenheit.class);
	        Marshaller m=jc.createMarshaller();
	  // Creating the Request Object
	        CelsiusToFahrenheit celsiusToFahrenheit=new CelsiusToFahrenheit();
	        celsiusToFahrenheit.setCelsius(10);
	        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
	        m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
	 
	        StringWriter wr=new StringWriter();
	  // Marshalling the object to the writer
	        m.marshal(celsiusToFahrenheit, wr);
	        System.out.println(wr.toString());
	        StringWriter finalResponseWriter = new StringWriter();
	  // Creating the Source and Result object, that will contain the corressponding REUQEST & RESPONSE.
	        StreamSource webServiceInput = new StreamSource(new StringReader(wr.toString()));
	        StreamResult webServiceOutput = new StreamResult(finalResponseWriter);
	  // Invoking the Web Service
	        webServiceTemplate.sendSourceAndReceiveToResult(webServiceInput,new WebServiceMessageCallback() {
	 
	         // This is very much required, since we need to set the ACTION as defined in the WSDL. ( Since a web service can contain multiple options
	        public void doWithMessage(WebServiceMessage message) {
	   // Please see the WSDL for more details.
	            ((SoapMessage)message).setSoapAction("http://tempuri.org/CelsiusToFahrenheit");
	        }
	    }, webServiceOutput);
	 // This line, will print the Response to the Console
	            System.out.println(finalResponseWriter.toString());
	           
	   // This will simply unmarshal the xml response in the Java Object (for easy handling of response)
	            JAXBContext jaxc=JAXBContext.newInstance(CelsiusToFahrenheitResponse.class);
	            CelsiusToFahrenheitResponse tr=(CelsiusToFahrenheitResponse)jaxc.createUnmarshaller().unmarshal(new StringReader(finalResponseWriter.toString()));
	            System.out.println(tr.getResult()  + "  is the result");
	        }
	        catch(Exception ex)
	        {
	            ex.printStackTrace();
	        }
	    }
	 
	}


Once the following will be executed, we will see the response on our console.

In the next two parts we will see the following:
Part 2: Making use of JAXB Marshalling & UnMarshalling to automate the above manual marshalling through coding.
Part 3: How to create a web service through Spring WS and provide a simple end point to support both SOAP 1.1 & SOAP 1.2
So, stay tuned.
分享到:
评论
1 楼 zhangli002 2015-01-20  
org.springframework.ws.client.core.WebServiceTemplate 这是在哪个包里,可以上传上来吗?

相关推荐

    Spring Recipes A Problem-Solution Approach [英文原版]

    One of the first (if not the first) books on the latest Spring 3.x, and the first Spring code Recipes book focused on Spring Web-tier development The Spring framework is growing. It has always been ...

    spring integration in action

    12: Web Services Part 4 - Advanced Topics 13: Monitoring and Management 14: Managing scheduling and concurrency 15: Spring Integration and the rich web 16: Messaging and batch operations 17...

    Manning Spring in Action 2nd Edition

    Springing into action 3 2 ■ Basic bean wiring 31 3 ■ Advanced bean wiring 72 4 ■ Advising beans 116 PART 2 ENTERPRISE SPRING................................................. 153 5 ...

    WebServices基础培训视频与源码

    资源名称:WebServices基础培训视频与源码资源目录:【】1.WebService之AXIS即时发布【】10.WebService之创建自己ws站点进行调用操作【】11.WebService之查询数据库操作【】12.使用xfire开发webServie操作不同的数据...

    Spring中文帮助文档

    13.1.2. Spring Web MVC框架的特点 13.2. DispatcherServlet 13.3. 控制器 13.3.1. AbstractController 和 WebContentGenerator 13.3.2. 其它的简单控制器 13.3.3. MultiActionController 13.3.4. 命令控制器 ...

    Spring API

    2. Spring 2.0和 2.5的新特性 2.1. 简介 2.2. 控制反转(IoC)容器 2.2.1. 新的bean作用域 2.2.2. 更简单的XML配置 2.2.3. 可扩展的XML编写 2.2.4. Annotation(注解)驱动配置 2.2.5. 在classpath中自动搜索组件...

    Spring 实践(Spring in Practice).pdf版本

    web flow, SOAP web services (REST web services are part of the core), enterprise integration, batch processing, mobile, various flavors of social (Facebook, LinkedIn, Twitter, GitHub, and so on), ...

    Portlets in action

    PART 2 DEVELOPING PORTLETS USING SPRING AND HIBERNATE Getting started with Spring Portlet MVC Annotation-driven development with Spring Integrating portlets with databases PART 3 ADVANCED PORTLET ...

    Spring.MVC.Cookbook.1784396419

    Complete support of REST web services makes the Spring architecture an extremely consistent choice to support your front-end needs and Internet transformations. From the design of your Maven modules,...

    Spring MVC Cookbook(PACKT,2016)

    Complete support of REST web services makes the Spring architecture an extremely consistent choice to support your front-end needs and Internet transformations. From the design of your Maven modules,...

    Spring jar包

    This tutorial shows you how to write contract-first Web services, that is, developing web services that start with the XML Schema/WSDL contract first followed by the Java code second. Spring-WS ...

    Spring.Boot.in.Action.2015.12.pdf

    Taking a fresh look at spring 2. Examining spring Boot essentials 4 What Spring Boot isn't 7 1.2 Getting started with Spring boot 8 Installing the spring boot cli 8 Initializing a spring boot project ...

    myeclipse 2015 stable 1 0 offline installer windows part01 1 14

    REST Web Services Project Explorer Mobile Tooling - PhoneGap Support New PhoneGap Configuration Editor PhoneGap Project JQuery Mobile Templates Server Connectors Updated to the WTP Framework ...

    Java测试新技术TestNG和高级概念.part2

    4.9 Java API for XML Web Services(JAX-WS) 4.10 Servlets 4.11 XML 4.12 本章小结 第5章 集成 5.1 Spring 5.2 Guice 5.3 DbUnit 5.4 HtmlUnit 5.5 Selenium 5.6 Swing UI测试 5.7 针对画图代码的测试 5.8 持续...

    usefullProjectCollect:github上一些觉得对自己工作有用的项目收集

    文章类[Building a REST API with JAXB, Spring Boot and Spring Data] ()Developing Services with Apache Camel[Part I: The Inspiration] ()[Part II: Creating and Testing Routes] ()[Part III: Integrating ...

    asp.net知识库

    ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 NET2.0系列介绍(一).NET 2.0 中Web 应用程序主题的切换 ASP.NET 2.0 中Web 应用程序主题的切换 2.0正式版中...

    Java测试新技术TestNG和高级概念.part1

    4.9 Java API for XML Web Services(JAX-WS) 4.10 Servlets 4.11 XML 4.12 本章小结 第5章 集成 5.1 Spring 5.2 Guice 5.3 DbUnit 5.4 HtmlUnit 5.5 Selenium 5.6 Swing UI测试 5.7 针对画图代码的测试 5.8 持续...

    restful restful所需要的jar包

    * Integration with Apache FileUpload to support multi-part forms and easily handle large file uploads from browsers * Transformer filter to easily apply XSLT stylesheets on XML representations. It ...

Global site tag (gtag.js) - Google Analytics