【翻译】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 : [url]http://www.w3schools.com/webservices/tempconvert.asmx[/url]
WSDL is : [url]http://www.w3schools.com/webservices/tempconvert.asmx?wsdl[/url]

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值