使用CXF发布基于maven的REST webservice接口

本文详细介绍了如何使用CXF和Maven创建RESTful Web Service。从MAVEN配置开始,逐步讲解创建实体类、接口及其实现。在配置CXF接口时遇到了'No message body writer'错误,解决办法是在配置中添加JSON解析类。同时,文章还展示了客户端调用服务的两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建REST webservice 服务端

第一步MAVEN配置

  • 主要配置信息
        <cxf.version>2.7.7</cxf.version>
        <!-- PERSISTENCE end -->
        <!-- SOAP begin -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
        </dependency>
        <!-- SOAP end -->
        <!-- JAX-RS begin -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.jaxrs</groupId>
            <artifactId>jackson-jaxrs-json-provider</artifactId>
        </dependency>
        <!-- JAX-RS end -->

第二步创建实体类

import java.io.Serializable;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

//通过注解,在网上序列号成xml或者json方式
@XmlRootElement(name = "Person")
public class Person implements Serializable {
    private static final long serialVersionUID = 1L;

    private String id;
    private String name;
    private String desc;

    @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;
    }

    @XmlElement(name = "desc")
    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Person [desc=" + desc + ", id=" + id + ", name=" + name + "]";
    }

}

第三步创建调用接口和实现

  • 接口

@Produces(MediaType.APPLICATION_JSON)
public interface IRestServiceTest extends Serializable{

    @GET
    @Path(value = "/person/{id}")
    public Person findPersonById(@PathParam("id") String id);

    @GET
    @Path(value="/persons")
    public String findAllPerson();

}
  • 实现
public class RestServiceImpl implements IRestServiceTest{

    private static final long serialVersionUID = 1L;

    @Override
    public Person findPersonById(String id) {
        Person person = new Person();

        person.setId(id);
        person.setName("1");
        person.setDesc("asfg");

        return person;
    }

    @Override
    public String findAllPerson() {
        // TODO Auto-generated method stub
        return "hello man";
    }

}

CXF接口配置信息

  • 主要配置信息
    <!-- 配置restful方式的web服务 -->
    <bean id="ps" class="com.cans.webservice.ws.server.impl.RestServiceImpl"></bean>

   <jaxrs:server id="personService" address="/rest">
        <jaxrs:serviceBeans>
            <ref bean="ps"/>
        </jaxrs:serviceBeans>

        <jaxrs:providers>  
            <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>  
        </jaxrs:providers>  
    </jaxrs:server>

这里有个坑

当时我在调用接口的时候报这个错误:No message body writer has been found for response class Person.
解决方法就在上面,CXF接口配置信息中最下面需要定义解析json的类;当时可是用了2个小时的时间,快疯了;

Client端

  • 使用依赖
<dependency>  
    <groupId>org.apache.cxf</groupId>  
    <artifactId>cxf-rt-rs-client</artifactId>  
    <version>3.1.12</version> 
</dependency> 
  • 客户端调用方法第一种
    public static void main(String[] args) {
        String baseAddress = "http://localhost:8077/ws/rest";

        JacksonJsonProvider jsonProvider = new JacksonJsonProvider();

        String productList = ClientBuilder.newClient().register(jsonProvider)
                .target(baseAddress).path("/persons")
                .request(MediaType.APPLICATION_JSON).get(String.class);

        System.out.println(productList);
    }
  • 客户端调用第二种
    @Test
    public void clientTest() {

        WebClient webClient = WebClient.create("http://localhost:8077/ws/rest").path("/person").path("1");
        Response resp3 = webClient.accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON).get();
        System.out.println(resp3.getMetadata());
        System.out.println(resp3.readEntity(String.class));

    }

以上就是这些:参考:http://www.cnblogs.com/friends-wf/p/3806206.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值