您的位置:首页 > 编程语言 > Java开发

CXF Spring开发WebService,基于SOAP和REST方式

2016-01-16 00:23 483 查看
官网示例

http://cxf.apache.org/docs/writing-a-service-with-spring.html

http://cxf.apache.org/docs/jax-rs-basics.html#JAX-RSBasics-HTTPMethod

----

版本CXF2.6.9

添加的包文件

这个版本的不可在Tomcat7上运行,会出错。



配置文件

applicationContext.xml

[html] view
plaincopy





<?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:jaxws="http://cxf.apache.org/jaxws"

xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />

<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<jaxws:endpoint id="helloWorld" implementor="demo.spring.service.HelloWorldImpl" address="/HelloWorld" />

<!-- http://localhost:7777/CXFDemo/services -->

<!-- http://localhost:7777/CXFDemo/services//HelloWorld?wsdl -->

</beans>

web.xml

[html] view
plaincopy





<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.0"

xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>WEB-INF/applicationContext.xml</param-value>

</context-param>

<listener>

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener>

<servlet>

<servlet-name>CXFServlet</servlet-name>

<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>CXFServlet</servlet-name>

<url-pattern>/services/*</url-pattern>

</servlet-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

接口及实现类文件

[java] view
plaincopy





package demo.spring.service;

import javax.jws.WebService;

@WebService

public interface HelloWorld {

String sayHi(String text);

}

[java] view
plaincopy





package demo.spring.service;

import javax.jws.WebService;

@WebService(endpointInterface="demo.spring.service.HelloWorld")

public class HelloWorldImpl implements HelloWorld {

@Override

public String sayHi(String text) {

System.out.println("sayHi called");

return "Hello " + text;

}

}

----------------

发布REST风格的webservice

定义接口和类

[java] view
plaincopy





package dcec.rdd;

import javax.ws.rs.GET;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

import javax.ws.rs.core.MediaType;

@Path("")

public interface RestHelloWorld {

@GET

@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})

@Path("/say/{name}")

public String say(@PathParam("name")String name);

@GET

@Produces ({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})

@Path("/getUser/{id}")

public List<User> getUser(@PathParam("id")String id);

@GET

@Path("/login")

public String login(@QueryParam("name")String name,@QueryParam("ps")String ps);

}

[java] view
plaincopy





package dcec.rdd;

import java.util.ArrayList;

import java.util.List;

import javax.ws.rs.PathParam;

//@Service("rest_HelloWorldImpl")

public class RestHelloWorldImpl implements RestHelloWorld {

public String say(String name) {

System.out.println(name + ", welcome");

return name+", welcome you.";

}

public List<User> getUser(String id){

List<User> list=new ArrayList<User>();

User user=new User();

user.setId(id);

user.setName("chen");

list.add(user);

User user1=new User();

user1.setId(id);

user1.setName("chen shi");

list.add(user1);

User user2=new User();

user2.setId(id);

user2.setName("chen shi cheng");

list.add(user2);

return list;

}

public String login(String name,String ps){

return "name: "+name+", password:"+ps;

}

}

[java] view
plaincopy





package dcec.rdd;

import javax.xml.bind.annotation.XmlElement;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="user")

public class User {

private String id;

private String name;

@XmlElement(name="ID")

public String getId(){

return id;

}

public void setId(String id){

this.id=id;

}

@XmlElement(name="NAME")

public String getName(){

return name;

}

public void setName(String name){

this.name=name;

}

}

拦截器自定义

[java] view
plaincopy





package dcec.rdd;

import java.io.UnsupportedEncodingException;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.apache.cxf.binding.xml.XMLFault;

import org.apache.cxf.interceptor.Fault;

import org.apache.cxf.message.Message;

import org.apache.cxf.phase.AbstractPhaseInterceptor;

import org.apache.cxf.phase.Phase;

import org.apache.cxf.transport.http.AbstractHTTPDestination;

public class HelloInInterceptor extends AbstractPhaseInterceptor<Message> {

public HelloInInterceptor(String phase) {

super(phase);

}

public HelloInInterceptor(){

super(Phase.RECEIVE);

}

public void handleMessage(Message message)throws Fault{

HttpServletRequest request=(HttpServletRequest)message.get(AbstractHTTPDestination.HTTP_REQUEST);

System.out.println("请求的字符集编码 "+request.getCharacterEncoding());

System.out.println("请求的URL "+request.getRequestURL());

// try {

// request.setCharacterEncoding("unicode");

// } catch (UnsupportedEncodingException e1) {}

String ip=request.getRemoteAddr();

System.out.println(request.getRequestURI());

Enumeration<String> e=request.getHeaderNames();

while(e.hasMoreElements()){

String str=e.nextElement();

System.out.println(str+" "+request.getHeader(str));

}

System.out.println(ip);

// XMLFault xmlFault=new XMLFault("异常");

// xmlFault.setStatusCode(4000);

// xmlFault.setMessage("wrong user and password");

//

// if(true)

// throw new Fault(xmlFault);

// System.out.println("****************************进入拦截器*********************************************");

// System.out.println(message);

//

// if (message.getDestination() != null) {

// System.out.println(message.getId() + "#"+message.getDestination().getMessageObserver());

// }

// if (message.getExchange() != null) {

// System.out.println(message.getExchange().getInMessage() + "#"+ message.getExchange().getInFaultMessage());

// System.out.println(message.getExchange().getOutMessage() + "#"+ message.getExchange().getOutFaultMessage());

// }

// System.out.println("**************************离开拦截器**************************************");

}

}

[java] view
plaincopy





package dcec.rdd;

import java.io.UnsupportedEncodingException;

import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.cxf.binding.xml.XMLFault;

import org.apache.cxf.interceptor.Fault;

import org.apache.cxf.message.Message;

import org.apache.cxf.phase.AbstractPhaseInterceptor;

import org.apache.cxf.phase.Phase;

import org.apache.cxf.transport.http.AbstractHTTPDestination;

public class HelloOutInterceptor extends AbstractPhaseInterceptor<Message> {

public HelloOutInterceptor(String phase) {

super(phase);

}

public HelloOutInterceptor(){

super(Phase.SEND);

}

public void handleMessage(Message message)throws Fault{

HttpServletResponse response=(HttpServletResponse)message.get(AbstractHTTPDestination.HTTP_RESPONSE);

response.setCharacterEncoding("utf-8");

System.out.println("**************************离开拦截器**************************************");

}

}

配置文件

[html] view
plaincopy





<?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: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.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">

<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" />

<jaxws:endpoint id="helloService" implementor="dcec.server.HelloServiceImpl" address="/helloService" />

<jaxws:endpoint id="PrintNameService" implementor="dcec.server.PrintNameImpl" address="/PrintNameService" />

<bean id="restHelloWorldImpl" class="dcec.rdd.RestHelloWorldImpl" />

<bean id="helloInInterceptor" class="dcec.rdd.HelloInInterceptor"/>

<bean id="helloOutInterceptor" class="dcec.rdd.HelloOutInterceptor"/>

<jaxrs:server id="restHelloWorld" address="/v1">

<jaxrs:serviceBeans>

<ref bean="restHelloWorldImpl" />

</jaxrs:serviceBeans>

<!--拦截器,请求和响应-->

<jaxrs:inInterceptors>

<ref bean="helloInInterceptor"/>

</jaxrs:inInterceptors>

<jaxrs:outInterceptors>

<ref bean="helloOutInterceptor"/>

</jaxrs:outInterceptors>

<jaxrs:extensionMappings>

<entry key="json" value="application/json" />

<entry key="xml" value="application/xml" />

</jaxrs:extensionMappings>

</jaxrs:server>

</beans>

访问地址测试
http://localhost:7777/CXFDemo/ws/ http://localhost:7777/CXFDemo/ws/v1/say/33 http://localhost:7777/CXFDemo/ws/v1/getUser/23/33?_type=json http://localhost:7777/CXFDemo/ws/v1/getUser/23/33?_type=xml //默认的方式xml
http://192.168.133.179:7777/CXFDemo/ws/v1/login?name=chen&ps=123
=========================================================

POJO类的参数

/article/7689402.html

[java] view
plaincopy





import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "book")

public class Book {

private int bookId;

private String bookName;

public int getBookId() {

return bookId;

}

public void setBookId(int bookId) {

this.bookId = bookId;

}

public String getBookName() {

return bookName;

}

public void setBookName(String bookName) {

this.bookName = bookName;

}

public String toString(){

return "[bookId:"+bookId+"],[bookName:"+bookName+"]";

}

}

[java] view
plaincopy





/**

* JSON提交

* url:http://localhost:9000/rest/json/addBook

* Json format:{"book":{"bookId":123,"bookName":"newBook"}}

*/

@POST

@Path("/addBook")

@Consumes("application/json")

public Response addBook(Book book);

/**

* Json提交2

* url:http://localhost:9000/rest/json/addBooks

* Json format:{"book":[{"bookId":123,"bookName":"newBook"},{"bookId":456,"bookName":"newBook2"}]}

*/

@POST

@Path("/addBooks")

@Consumes("application/json")

public Response addBooks(List<Book> books);

[java] view
plaincopy





@Override

public Response addBook(Book book) {

System.out.println("addBook is called...");

return Response.ok().entity(book.toString()).build();

}

@Override

public Response addBooks(List<Book> books) {

System.out.println("addBooks is called...");

return Response.ok().entity("ok").build();

}

测试html 提交

[html] view
plaincopy





<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="http://192.168.133.179:8080/ychserver/ws/v1/file/imageupload" method="post" enctype="multipart/form-data" >

<p>id:<input type="text" name="id"/></p>

<p>name:<input type="text" name="name"/></p>

<p>image:<input type="file" name="file"/>

<p><input type="submit" value="sub"/></p>

</form>

</body>

</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: