Spring – Exposing a bean as both REST (xml, json, …) and SOAP WebServices

[url]http://raulraja.com/2009/06/25/spring-exposing-a-bean-as-rest-xml-json-and-soap-webservice/[/url]
Often times you have Spring services that you want to expose as web-services. In this small tutorial I’ll just show a few configuration files and code that demonstrate how a service and its implementation can accommodate both REST and SOAP access to the same backbone.

Thanks Justin for the REST part.

This tutorial is available for download with svn:
svn checkout http://raulrajatutorials.googlecode.com/svn/trunk/ raulrajatutorials-read-only
Comments in the code itself should be self-explanatory if you already have some java + spring experience.
I have not included the dependencies on CXF for simplicity but you can take a look at them and some for the other tutorials here.

And now to the point.
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cxf="http://cxf.apache.org/core"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/core
http://cxf.apache.org/schemas/core.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/jaxrs
http://cxf.apache.org/schemas/jaxrs.xsd"
default-autowire="byName">

<!-- Load CXF modules from cxf.jar -->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/>

<cxf:bus>
<cxf:features>
<cxf:logging/>
</cxf:features>
</cxf:bus>

<!-- The hello world service -->
<bean id="helloWorldService" class="com.raulraja.ws.impl.HelloWorldServiceImpl" autowire="autodetect"/>

<!-- Exposing the Helloworld service as a rest service -->
<jaxrs:server id="restServer" address="/rest/">
<jaxrs:serviceBeans>
<ref bean="helloWorldService"/>
</jaxrs:serviceBeans>
<jaxrs:extensionMappings>
<entry key="feed" value="application/atom+xml"/>
<entry key="json" value="application/json"/>
<entry key="xml" value="application/xml"/>
<entry key="html" value="text/html"/>
</jaxrs:extensionMappings>
</jaxrs:server>


<!-- Exposing the HelloWorld service as a SOAP service -->
<bean id="jaxbBean"
class="org.apache.cxf.jaxb.JAXBDataBinding"
scope="prototype"/>

<bean id="jaxws-and-aegis-service-factory"
class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
scope="prototype">
<property name="dataBinding" ref="jaxbBean"/>
<property name="serviceConfigurations">
<list>
<bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration"/>
<bean class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration"/>
<bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration"/>
</list>
</property>
</bean>


<jaxws:endpoint id="helloWorldServiceEndpoint"
serviceName="HelloWorld"
implementorClass="com.raulraja.ws.HelloWorldService"
implementor="#helloWorldService"
address="/helloWorldService">
<jaxws:serviceFactory>
<ref bean="jaxws-and-aegis-service-factory"/>
</jaxws:serviceFactory>
</jaxws:endpoint>

</beans>

HelloWorldService.java

package com.raulraja.ws;

import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.jws.WebService;
import javax.jws.WebMethod;

/**
* The hello world service interface exposed as soap and rest
*
* @ WebService is for soap
* @ Path is for the rest top path
*/
@Path("/helloWorldService/")
@WebService(serviceName = "HelloWorld", name = "HelloWorldService", targetNamespace = "http://ws.raulraja.com")
public interface HelloWorldService {

/**
* Simple methods that says hello
*
* @return hello world rest and soap!!!
* @ WebMethod is for soap
* @ GET is for REST
* @ Path is for the REST service path
*/
@WebMethod
@GET
@Path("/")
HelloWorld sayHello();

}

HelloWorldServiceImpl.java

package com.raulraja.ws.impl;

import com.raulraja.ws.HelloWorld;
import com.raulraja.ws.HelloWorldService;

/**
* Implementation of the hello world web service.
*/
public class HelloWorldServiceImpl implements HelloWorldService {

/**
* Simple methods that says hello
*
* @return hello world rest and soap!!!
*/
public HelloWorld sayHello() {
HelloWorld helloWorld = new HelloWorld();
helloWorld.setMessage("Hello world rest and soap!!!");
return helloWorld;
}
}

HelloWorld.java

package com.raulraja.ws;

import javax.xml.bind.annotation.XmlRootElement;

/**
* Hello world object that demonstrates the service
*/
@XmlRootElement
public class HelloWorld {

/**
* the message
*/
private String message;

/**
* @return the message
*/
public String getMessage() {
return message;
}

/**
* @param message sets the message
*/
public void setMessage(String message) {
this.message = message;
}
}

And here is some screen captures for the results…

Soap Services list
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值