`

【翻译】Spring Web Services 2 - Part II ( Marshalling , UnMarshalling using JAXB)

阅读更多
原文地址: http://panbhatt.blogspot.com/2011/03/spring-web-services-2-part-i.html

In second part of the series, we will talk about how to use Marshaller's in order to automatically convert your request and response object to the SOAP Body XML (of request n response ) with the corresponding Namespace defined in the Java Source files.
Just like the first part, we will use Spring WS2- Part I we will use the same web service hosted at W3Schools.com but this time, with a very short code, as compared to Part-I .
Spring Web Services 2 makes use of a number of marshallers and unmarshallers in order to perform the tasks that include Spring OXM, Castom, Jaxb2. As JAXB 2 is the specification, so we will go by that only.

Note: Please add Jaxb libraries in your classpath while performing the action during this tutorial.

Configuration: So we will directly delve in the spring configuration (acjaxb.xml) as required for this tutorial.

<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.oxm.jaxb.Jaxb2Marshaller" id="marshaller">
	        <beans:property name="classesToBeBound">
	        
	            <beans:list>
	 
	                <beans:value>springwsjxb.CelsiusToFahrenheit</beans:value>
	                <beans:value>springwsjxb.CelsiusToFahrenheitResponse</beans:value>
	                 
	            </beans:list>
	        </beans:property>
	   
	        <beans:property name="marshallerProperties">
	            <beans:map>
	                <beans:entry key="jaxb.formatted.output" value-ref="true">
	            </beans:entry></beans:map>
	        </beans:property>
	    </beans:bean>
	 
	    <beans:bean class="java.lang.Boolean" id="true">
	        <beans:constructor-arg value="True">
	    </beans:constructor-arg></beans:bean>
	 
	      
	     <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 name="marshaller" ref="marshaller">
	        <beans:property name="unmarshaller" ref="marshaller">
	    </beans:property></beans:property></beans:property></beans:constructor-arg></beans:bean>
	 
	 
	</beans:bean></beans:beans>


As our current configuration describes that we are using two classes CelsiusToFahrenheit and CelsiusToFahrenheitResponse present in the springws packagejxb. Here is the corresponding source code for both of them. The Source code includes the Namespace details also, it becomes very important once we need to generate the XML, in any case if we missed out the namespace the coressponding web service will not be able to parse it and will throw an exception.

CelsiusToFahrenheit.java

package springwsjxb;
	 
	import javax.xml.bind.annotation.XmlElement;
	import javax.xml.bind.annotation.XmlRootElement;
	import javax.xml.bind.annotation.XmlType;
	 
	/**
	 *
	 * @author PankajB
	 */
	@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;
	    }
	}
	<span class="Apple-style-span" style="font-family: 'Times New Roman';"><span class="Apple-style-span" style="white-space: normal;">
	</span></span>


CelsiusToFahrenheitResponse.java

package springwsjxb;
	 
	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;
	 
	    //CelsiusToFahrenheitResult is the name of the XML Element which is being returned from the Web service and belongs to namespace "http://tempuri.org/"
	 
	    @XmlElement(name="CelsiusToFahrenheitResult",namespace="http://tempuri.org/")
	    public int getResult() {
	        return result;
	    }
	 
	    public void setResult(int result) {
	        this.result = result;
	    }
	 
	}


As per the requirements of the web service, we had kept only those variables here in our objects.
Now our Main.java file which will be responsible for invoking the web service and give us the response object.


Main.java

package springwsjxb;
	 
	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
	        {
	   // Load the spring web service configuration file
	        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springwsjxb/acjaxbb.xml");
	        WebServiceTemplate webServiceTemplate = (WebServiceTemplate)applicationContext.getBean("webServiceTemplate");      
	        // Creating the Request Object and setting it properties
	        CelsiusToFahrenheit celsiusToFahrenheit=new CelsiusToFahrenheit();
	        celsiusToFahrenheit.setCelsius(100);
	        // Invoking the web service and getting the response back.
	                CelsiusToFahrenheitResponse c=(CelsiusToFahrenheitResponse)webServiceTemplate.marshalSendAndReceive(celsiusToFahrenheit,new WebServiceMessageCallback() {
	 
	     // Setting the SOAP Action
	        public void doWithMessage(WebServiceMessage message) {
	            ((SoapMessage)message).setSoapAction("http://tempuri.org/CelsiusToFahrenheit");
	        }
	    });
	 
	 
	               System.out.println("THE RESPONSE From Web Service IS "+ c.getResult());
	 
	        }
	        catch(Exception ex)
	        {
	            ex.printStackTrace();
	        }
	    }
	 
	}


The code is pretty self explanatory, except at one point where we need to cast the object to our corresponding response, as the web service template does not provide any way to specify in the parameter list about the kind of response object we are expecting to receive.

Once it gets executed we will receive the result on to our console.
Someetimes our web servie is accessible only through HTTPS protocol, however the tried to just replace the URI Of my web services template, and it seems to work without any added configurtion. It might be possible that we need to install the certificate on our system either manually or through a software called PORTECLE.
So that's all for the time.
In the next part we will see how to create a web service through spring ws 2 and implement the same endpoint for both SOAP 1.1 & SOAP 1.2 i.e. we will not bother about whether client is invoking through text/xml or application/soap+xml (SOAP 1.2). Really Spring WS makes it so easy.
Thanks Arjen Postuma.
分享到:
评论

相关推荐

    jaxb-impl.jar包

    2. **Java对象到XML的转换**:相反,JAXB也支持将Java对象转换回XML文档,这被称为“marshalling”。这个过程使得Java应用程序能够生成符合XML规范的数据格式。 3. **数据绑定**:JAXB通过自动生成的源代码或用户...

    jaxws-api-2.1_jaxb-api-2.1.jar

    标题"jaxws-api-2.1_jaxb-api-2.1.jar"中的"jaxws-api-2.1"指的是Java API for XML Web Services(JAX-WS)的2.1版本,这是一个Java平台上的标准,用于创建基于Web服务的应用程序。它简化了客户端和服务端之间的SOAP...

    spring-ws-reference.pdf

    Spring Web Services(Spring-WS)是Spring框架的一个模块,它为构建基于SOAP的消息服务提供了一种轻量级的编程和配置模型。本文主要介绍了Spring Web Services的基本概念、为什么选择契约先行(Contract First)的...

    jaxb-api jaxb-impl jar

    它提供了必要的接口和类,如`javax.xml.bind.JAXBContext`, `Unmarshaller`, `Unmarshaller`, 和 `Validator`等,用于实现XML到Java对象的编组(marshalling)和反编组(unmarshalling)。API本身不包含具体的实现,...

    jaxb最新版本2.2.6

    5. ** Marshalling 和 Unmarshalling**: JAXB提供了`Unmarshaller`和`Marshaller`接口,用于将Java对象转换为XML文档( marshalling)和从XML文档恢复Java对象(unmarshalling)。 6. **XML Schema支持**: JAXB可以...

    dom4j-1.6.1+httpclient-4.5.7+httpcore-4.4.5+jaxb-core+jaxb-impl.jar 亲测有用

    它提供了两种主要的功能:XML到Java对象的绑定(unmarshalling)和Java对象到XML的绑定(marshalling)。JAXB Core是JAXB的基础模块,而JAXB-Impl是实现这些功能的具体库。这两个组件结合使用,可以方便地在Java应用...

    netty-JBoss-Marshalling:使用JBoss-marshalling编码包进行java的序列号编码

    netty-JBoss-Marshalling 使用JBoss-marshalling编码包进行java的序列号编码 JBoss Marshalling是一个Java对象的序列化API包,修正了JDK自带的序列化包的很多问题, 但又保持跟java.io.Serializable接口的兼容;同时...

    spring-ws-reference-1.5.9

    ### Spring Web Services (1.5.9):深入解析与应用实践 #### 一、Spring Web Services 概述 **Spring Web Services** 是一个用于构建 Web 服务的应用框架,它与 **CXF** 和 **AXIS** 等其他流行的 Web 服务框架...

    jboss-marshalling-1.3.0.CR9.jar, jboss-marshalling-serial-1.3.0.CR9.jar

    jboss-marshalling-1.3.0.CR9.jar jboss-marshalling-serial-1.3.0.CR9.jar

    jaxb解析xml

    2. 操作 API:提供了统一的基本操作(如 marshalling,unmarshalling),隐藏了 JAXB 内部操作的实现代码。 JAXB 的基本操作 ------------------- ### 3.1 XML 和 Java 类绑定 JAXB 提供了两种方式将 Java 对象...

    Building RESTful Web Services with Java EE 8

    Next up, you will learn about the specifics of data binding and content marshalling using the JSON-B 1.0 and JSON-P 1.1 APIs. This book also guides you in leveraging the power of asynchronous APIs on...

    java学习之jaxb的学习一

    JAXB主要包含两个核心过程:对象到XML的转换(marshalling)和XML到对象的转换(unmarshalling)。 1. Marshalling:将Java对象转换为XML文档。当一个Java对象需要被保存或者发送时,可以通过JAXB将其转换为XML格式...

    spring-framework-reference-4.1.2

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

    利用jaxb实现xml和bean互转

    4. **易于集成**: JAXB可以轻松地与Spring、JSF等其他Java框架集成。 **四、实际应用** 在实际开发中,JAXB常用于Web服务、配置文件解析、数据交换等场景。例如,一个Web服务可能接收XML请求,然后使用JAXB将其...

    jaxb (XML操作)

    2. **实例化(Unmarshalling)**:当需要将XML数据转换为Java对象时,JAXB使用Unmarshaller接口解析XML文档,生成对应的Java对象。这个过程是将XML数据"反序列化"为可操作的Java对象。 3. **序列化(Marshalling)*...

    JAXB xml与对象转换

    JAXB的核心概念是两个主要的过程:**Unmarshalling** 和 **Marshalling**。 1. **Unmarshalling**:这是将XML文档解析成Java对象的过程。JAXB通过解析XML文档,根据预先定义的XML Schema(XSD)或者Java注解(@...

    spring webService1.51官方指南[pdf]

    AbstractMarshallingPayloadEndpoint 类提供了基于 JAXB 的 Marshalling 和 Unmarshalling 功能。 **5.4.3 @Endpoint 注解** @Endpoint 注解用于标记一个类作为 Endpoint,简化了 Endpoint 的配置过程。 **5.5 ...

    spring3.1所需的全部jar包

    此外,`spring-orm.jar`和`spring-oxm.jar`分别提供了与ORM(Object-Relational Mapping)框架(如Hibernate、JPA)和XML Marshalling/Unmarshalling的集成。 这些jar包组合在一起,构成了Spring 3.1的完整生态系统...

Global site tag (gtag.js) - Google Analytics