`

webservice学习 4.JAX-RS简单使用 以及message body writer错误解决[CXF 2.7.4]

 
阅读更多

JAX-RS实际做起来还是蛮简单的.

JAX-RS和JAX-WS的不同之处吧

个人觉得是

JAX-RS更在意资源的位置  通过定义Path来寻找资源 而获取资源这个动作则是透明的

而JAX-WS是执行一个动作来获取资源 他对资源的位置是不知道的

 

这是两种不同的思路 JAX-RS有一种把资源通过资源的位置公开的直感 而JAX-WS是把使用的方法给公开

以上只是自己的想法 初学webservice 如果理解错了欢迎指正下.

 

 

首先提提操作过程中出现的一个错误

ID: 1
Response-Code: 500
Content-Type: text/plain
Headers: {Date=[Mon, 20 May 2013 15:19:49 GMT]}
Payload: No message body writer has been found for response class ArrayList.

 

使用了以下路径:

http://localhost:8888/produce/manu?manu=cc

 对应的方法是:

	@GET
	@Path("/manu")
//	@Produces("application/xml")
	public List<Product> getByManufacture(@QueryParam("manu") String manufacture);

 网上说是要对List重新封装下 用@XmlRootElement注解解决下

后来我发现只要把注释那边打开就可以了 加上一个Produces 告知产生的是什么类型(还可以是application/json等)

修改后显示正常了:

<Products>
<Product id="1" name="pt">
<price>12.2</price>
<createTime>2013-05-20T22:41:53.489+08:00</createTime>
<count>5</count>
<manufacturer>cc</manufacturer>
<phoneNumber>123456</phoneNumber>
</Product>
</Products>

 

这里说明下笔者使用的版本是:CXF 2.7.4 

 

其实这个问题产生还是因为通过的是浏览器直接打开吧 用HttpComponent组件直接连接是不会产生的

不过实际使用还是指定一下比较好 而且可以通过指定不同的类型来通过path的设定返回不同的格式.

 

关于Produces的更多资料参阅:

写道
http://docs.oracle.com/javaee/6/api/javax/ws/rs/Produces.html

 

 

 

 

 

好了接下来是操作步骤:

 

 

首先是对实体类进行操作 涉及到一些JAXB的注解(忽略掉JPA的注解吧):

package org.cc.rs.vo;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Product")
@Entity
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {

	@Id
	@GeneratedValue
	@Column(name="id")
	@XmlAttribute(name="id")
	private int id;
	
	@Column(unique=true,nullable=false)
	@XmlAttribute(name="name")
	private String name;
	
	@XmlElement(name="price")
	private double price;
	
	@XmlElement(name="createTime")
	private Date createTime;
	
	@XmlElement(name="count")
	private int count;

	@XmlElement(name="manufacturer")
	private String manufacturer;
	
	@XmlElement(name="phoneNumber")
	private String phoneNumber;

        省略getter和setter... 
        ... ...

	@Override
	public String toString() {
		return "Product [id=" + id + ", name=" + name + ", price=" + price
				+ ", createTime=" + createTime + ", count=" + count
				+ ", manufacturer=" + manufacturer + ", phoneNumber="
				+ phoneNumber + "]";
	}
	
	
}

第一步完成了 我们要传输的资源的格式也规定好了

 

 

那么接下来就是把这个资源放出去 可以让外界通过位置来找寻:

这边简单起见就写了两个方法:

package org.cc.rs.service;

import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import org.cc.rs.vo.Product;

@Path("/produce/")
public interface IProductService {

	// http://localhost:8888/produce/name?name=pt
	@GET
	@Path("/name")
	@Produces("application/xml")
	public Product getByName(@QueryParam("name") String name);
	
	// http://localhost:8888/produce/manu?manu=cc
	@GET
	@Path("/manu")
	@Produces("application/xml")
	public List<Product> getByManufacture(@QueryParam("manu") String manufacture);
}

 

 

 ok 位置也确定好后 接下来就是发布了:

package org.cc.rs.server;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.cc.rs.service.impl.ProductServicce;

public class Server {

	public static void main(String[] args) {

		JAXRSServerFactoryBean bean=new JAXRSServerFactoryBean();
		bean.getInInterceptors().add(new LoggingInInterceptor());
		bean.getOutInterceptors().add(new LoggingOutInterceptor());
		bean.setResourceClasses(ProductServicce.class);
		bean.setAddress("http://localhost:8888/");
		bean.create();
	}
}

 浏览器输入地址就可以看见结果了

 

如果哪里说错了 谢谢指正 刚学了一段时间 基础什么的都不是很扎实.

0
1
分享到:
评论
4 楼 fair_jm 2014-01-15  
Jacarri_Chan 写道
fair_jm 写道
Jacarri_Chan 写道
【后来我发现只要把注释那边打开就可以了 加上一个Produces 告知产生的是什么类型(还可以是application/json等)】

可以用这个  “ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON”,引用常量,防止手写出错。



你调试json了吗?  我这边总是出错:  【 No message body writer has been found for response class】


都可以的 原来这些都试过了 没什么问题呢

学完感觉用web service的意义好像不是特别大...
普通点的web应用 只要增加一个JSON或xml返回的地址就行 或者根据HTTP报文头的CONTENT_TYPE来判断返回类型(RESTful)
java里用个jackson就行了 类似于一些框架的renderJson renderXML的样子


【学完感觉用web service的意义好像不是特别大...】,开始我也这么想的。设想一个场景吧:如果一个资源需要客户端提供证书才能能访问,用json,怎么解决?

用WS的话我记得有WS-Security 不过当时学的时候就看了下 基本略过去了

那个也不一定需要web service吧 比如用POST方式提交 把json信息放在POST的entity中 后面的实现就很随意了 用个拦截器之类的 在操作前下解析下POST就可以了
3 楼 Jacarri_Chan 2014-01-15  
fair_jm 写道
Jacarri_Chan 写道
【后来我发现只要把注释那边打开就可以了 加上一个Produces 告知产生的是什么类型(还可以是application/json等)】

可以用这个  “ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON”,引用常量,防止手写出错。



你调试json了吗?  我这边总是出错:  【 No message body writer has been found for response class】


都可以的 原来这些都试过了 没什么问题呢

学完感觉用web service的意义好像不是特别大...
普通点的web应用 只要增加一个JSON或xml返回的地址就行 或者根据HTTP报文头的CONTENT_TYPE来判断返回类型(RESTful)
java里用个jackson就行了 类似于一些框架的renderJson renderXML的样子


【学完感觉用web service的意义好像不是特别大...】,开始我也这么想的。设想一个场景吧:如果一个资源需要客户端提供证书才能能访问,用json,怎么解决?
2 楼 fair_jm 2013-12-07  
Jacarri_Chan 写道
【后来我发现只要把注释那边打开就可以了 加上一个Produces 告知产生的是什么类型(还可以是application/json等)】

可以用这个  “ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON”,引用常量,防止手写出错。



你调试json了吗?  我这边总是出错:  【 No message body writer has been found for response class】


都可以的 原来这些都试过了 没什么问题呢

学完感觉用web service的意义好像不是特别大...
普通点的web应用 只要增加一个JSON或xml返回的地址就行 或者根据HTTP报文头的CONTENT_TYPE来判断返回类型(RESTful)
java里用个jackson就行了 类似于一些框架的renderJson renderXML的样子
1 楼 Jacarri_Chan 2013-12-07  
【后来我发现只要把注释那边打开就可以了 加上一个Produces 告知产生的是什么类型(还可以是application/json等)】

可以用这个  “ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON”,引用常量,防止手写出错。



你调试json了吗?  我这边总是出错:  【 No message body writer has been found for response class】

相关推荐

    java_webservice_JAX-RS.zip_cxf_jax_jax-rs_spring cxf

    文件"java webservice CXF JAX-WS(SOAP) + JAX-RS(RESTfull).docx"可能包含了具体的示例代码和详细步骤,帮助理解如何在SSH环境中集成并使用CXF和JAX-RS。建议参考文档中的内容进行实践操作,以加深理解。 总的来说...

    JAX-RS cxf web服务 rest简单增删改查 集成spring webService

    **JAX-RS CXF Web服务 RESTful CRUD与Spring集成详解** JAX-RS(Java API for RESTful Web Services)是Java平台上的一个标准,用于创建RESTful Web服务。REST是一种轻量级的架构风格,它以资源为中心,通过HTTP...

    JAX-RS包(内含1.0和1.4)

    JAX-RS通过提供一套简单易用的API,使得开发者可以轻松地在Java应用中创建REST接口。 本压缩包包含JAX-RS的两个版本,即1.0和1.4。这两个版本主要的区别在于功能的完善和对标准的遵循程度。JAX-RS 1.0是最初的规范...

    jax-ws jax-rs 分别创建soap和restful类型的webservice

    本篇将详细介绍如何使用Java技术栈,特别是JAX-WS和JAX-RS,以及Maven和Spring来创建这两种不同类型的Web服务。 首先,让我们关注SOAP Web服务的创建,这是通过JAX-WS实现的。JAX-WS是Java API for XML Web ...

    webservice Demo注解+jax-ws

    在这个“webservice Demo注解+jax-ws”示例中,我们将深入探讨Web服务的注解使用以及基于Java API for XML Web Services (JAX-WS)的实现。 首先,让我们了解一下JAX-WS。它是Java平台的标准组件,用于创建和处理Web...

    Jax-ws所需要的JAR包

    Java API for XML Web Services...总的来说,JAX-WS是Java平台上的一个强大工具,它使得开发和使用Web服务变得简单。通过理解并正确配置所需的JAR文件,开发者可以在Tomcat等服务器上顺利地实现Web服务的发布和调用。

    JAX-WS 2.2 RI所有相关jar包

    JAX-WS 2.2 RI 所包含的JAR包集合,包含25个JAR包,列表如下: FastInoset.jar gmbal-api-only.jar ha-api.jar javax.annotation.jar javax.mail_1.4.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jaxws-api...

    javax.ws.rs-api-2.0.jar

    【描述】"restful webservice 所需要的 javax.ws.rs-api-2.0.jar" 指出,这个jar文件是构建RESTful Web服务所必需的组件。REST(Representational State Transfer)是一种轻量级的网络通信协议,常用于构建Web服务,...

    apache-cxf-2.7.4

    在2.7.4版本中,CXF支持SOAP、RESTful(Representational State Transfer)服务,以及WS-*(Web Services star)规范,如WS-Security、WS-ReliableMessaging等,使得开发者可以创建符合标准的、安全的、可靠的Web...

    如何基于JAX-WS开发一个WebService实例

    在IT行业中,Web服务是一种广泛使用的通信协议,它允许不同应用程序之间进行数据交换。JAX-WS(Java API for XML Web Services)是Java平台上的一个标准,用于创建和消费Web服务。本篇将深入讲解如何基于JAX-WS开发...

    jax-ws webservice demo

    注:如果使用的是 myeclipse 时 server 部署到tomcat 启动的时候会报错 解决办法:找到myeclipse安装目录下的 plugins 目录里 查找 webservices-rt.jar,然后将webservices-rt.jar 外层的 lib目录里删除,或者备份的...

    JAX-WS Webservice

    **JAX-WS Web服务详解** Java API for XML Web Services(JAX-WS)是Java平台上用于构建和消费Web服务的标准API。...在实际开发中,根据项目需求选择JAX-WS或JAX-RS,或者结合两者以实现灵活的Web服务解决方案。

    webservice之jax-ws

    开发者可以使用诸如Apache CXF、Metro等开源框架来支持JAX-WS的开发,这些框架提供了更多的功能,如WS-Security、WS-Policy等扩展,同时简化了开发过程。 8. **示例** 在提供的链接...

    基于JDK自带的Web服务JAX-WS实现WebService的简单示例

    Java 基于第三方插件实现WebService实在麻烦,尤其是要添加几十M的Jar包...还好,自从JDK 1.6开始,Java自身已经支持WebSeervice的开发即JAX-WS,附件是一个简单的示例,供入门参考。注意,JDK环境要求1.6及以上版本。

    jax-ws实现webservice调用

    使用JAX-WS,你可以通过添加注解(如`@WebService`)或使用XML配置文件来部署服务。对于简单的应用,注解方式更常见。例如,部署到Tomcat服务器时,只需确保服务类位于正确的包结构中,然后启动服务器。 ### 4. ...

    webservice-cxf-spring-jar.zip

    【标题】"webservice-cxf-spring-jar.zip" 是一个包含了使用Apache CXF与Spring框架集成开发Web服务的Java库集合。这个压缩包提供了一整套必要的JAR文件,以便于开发者在他们的项目中快速搭建和运行基于CXF的Web服务...

    JAX-WS 2.2 完整jar包

    JAX-WS 2.2 RI 所包含的JAR包集合,包含25个JAR包,列表如下: FastInoset.jar gmbal-api-only.jar ha-api.jar javax.annotation.jar javax.mail_1.4.jar jaxb-api.jar jaxb-impl.jar jaxb-xjc.jar jaxws-api...

    webservice实例 CXF的JAXWS和JAXRS实现 及JAXB标准接口实现带jar包

    在提供的压缩包“ws_test”中,很可能包含了使用CXF实现的Web服务示例,包括JAX-WS和JAX-RS的服务端点,以及使用JAXB进行数据交换的类。这个实例可能是全部手写的,意味着它提供了一整套从创建服务到处理请求和响应...

    jax-ws api jar包

    - **简单性**:JAX-WS使用注解和Java语言特性,使得Web服务的开发更加直观和简洁。 - **互操作性**:遵循SOAP和WSDL标准,确保与不同平台和语言的服务进行交互。 - **可扩展性**:支持WS-Security、WS-...

Global site tag (gtag.js) - Google Analytics