创建一个简单的JAX-RS MessageBodyWriter

JAX-RS确实很酷,借助JAXB,只需添加带有JAXB批注的批注数据对象,即可为您转换许多响应数据类型。 我对JAXB相当陌生,但是一些简单的注释剪切/粘贴操作将带给您很长的路要走。

出于无法从JAX-RS资源方法返回该数据类型的目的,可能有某些类型的数据无法注释或不会注释。 一个简单的示例是返回布尔(原始)或包装器布尔类。 我在StackOverflow上读了一个问题,有人问他们是否可以从资源方法返回布尔值,并且由于我不知道答案,所以我决定尝试一下! 我的版本仅返回XML,而不返回JSON,但您应该了解一下。

我从《泽西岛用户指南》的HelloWorld示例开始,然后从那里开始进行修改。 我使用了pom.xml,唯一的变化是取消注释了一个块以允许使用JSON。

主班

这来自Hello World示例的主类,没有任何更改。

package com.example;import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;import java.io.IOException;
import java.net.URI;/*** Main class.**/
public class Main {// Base URI the Grizzly HTTP server will listen onpublic static final String BASE_URI = "http://localhost:8080/myapp/";/*** Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.* @return Grizzly HTTP server.*/public static HttpServer startServer() {// create a resource config that scans for JAX-RS resources and providers// in com.example packagefinal ResourceConfig rc = new ResourceConfig().packages("com.example");// create and start a new instance of grizzly http server// exposing the Jersey application at BASE_URIreturn GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);}/*** Main method.* @param args* @throws IOException*/public static void main(String[] args) throws IOException {final HttpServer server = startServer();System.out.println(String.format("Jersey app started with WADL available at "+ "%sapplication.wadl\nHit enter to stop it...", BASE_URI));System.in.read();server.stop();}
}

资源类别

我创建了一个资源类,其中包括一个GET方法返回一个布尔值,另一个GET方法返回包装布尔值类。 注意,getBool()和getBoolean()方法将XML作为第一个选项。

package com.example;import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;/*** Root resource (exposed at "myresource" path)*/
@Path("myresource")
public class MyResource {/*** Method handling HTTP GET requests. The returned object will be sent* to the client as "text/plain" media type.** @return String that will be returned as a text/plain response.*/@GET@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN})public String getIt() {return "Got it!";}@GET@Path("/bool")@Produces({MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN})public boolean getBool() {return false;}@GET@Path("/Boolean")@Produces({MediaType.APPLICATION_XML, MediaType.TEXT_PLAIN})public Boolean getBoolean() {return Boolean.TRUE;}
}

BooleanMessageBodyWriter类

这是有趣的部分,创建MessageBodyWriter类以允许资源方法返回布尔值或布尔值的XML。

package com.example;import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.WebApplicationException;
import java.io.IOException;
import java.io.InputStream;
import java.io.DataOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Serializable;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;@Provider
@Produces("application/xml")
public class BooleanMessageBodyWriter implements MessageBodyWriter{@Overridepublic boolean isWriteable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) {System.out.println("isWriteable called...");return type == Boolean.class;}@Overridepublic long getSize(Boolean myBool, Class type, Type genericType,Annotation[] annotations, MediaType mediaType) {// deprecated by JAX-RS 2.0 and ignored by Jersey runtimereturn 0;}@Overridepublic void writeTo(Boolean myBool,Class type,Type genericType,Annotation[] annotations,MediaType mediaType,MultivaluedMaphttpHeaders,OutputStream entityStream)throws IOException, WebApplicationException {StringBuilder sb = new StringBuilder();sb.append("").append(myBool.toString()).append("");DataOutputStream dos = new DataOutputStream(entityStream);dos.writeUTF(sb.toString());}
}

我以前没有使用过Maven,但是在安装maven之后,以下目标是编译和运行项目所需的全部(当然!)。

  • mvn compile –编译代码
  • mvn exec:java –启动Grizzly HttpServer并部署Restful服务。

希望这可以帮助!

参考:从我们的JCG合作伙伴 Mike Miller在Scratching我的编程痒博客上创建一个简单的JAX-RS MessageBodyWriter 。

翻译自: https://www.javacodegeeks.com/2014/03/creating-a-simple-jax-rs-messagebodywriter.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/364627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud学习笔记(6)----Spring Cloud Netflix之负载均衡-Ribbon的使用

1. 什么是负载均衡? 负载均衡,就是分发请求流量到不同的服务器。 负载均衡一般分为两种 1. 服务器端负载均衡(nginx) 2. 客户端负载均衡(Ribbon) 2. 服务提供者(spring-cloud-provider&#xff…

pHp中文网零基础,零基础编程

基础编程conmysql_connect(constant("SERVER"),constant("USERNAME"),constant("PASSWORD"));if(!$this->con){die(connet to mysql error.mysql_error());}else{mysql_select_db(constant("DATABASE"),$this->con);}}function …

正确判断js数据类型 总结记录

正确判断js数据类型 总结记录 判断js中的数据类型有一下几种方法:typeof、instanceof、 constructor、 prototype、 三方库。 js六大数据类型 number: 数字,整数、浮点数等等, string: 单引号或者双引号来说明&…

wait/notify实现线程间的通信

使线程之间进行通信之后,系统间的交互性更加强大,在大大提高CPU利用率的同时还会使程序对各线程任务在处理的过程中进行有效的把控与监督。 1.不使用wait/notify实现线程间通信 使用sleep()while(true)也可以实现线程间通信。 例如:两个线程&#xff0c…

项目学生:使用AOP简化代码

这是Project Student的一部分。 许多人坚信方法应适合您的编辑器窗口(例如20行),而有些人则认为方法应小于此范围。 这个想法是一种方法应该做一件事,而只能做一件事。 如果它做的还不止于此,则应将其分解为多种方法&…

洛谷 P3367 【模板】并查集

嗯... 题目链接:https://www.luogu.org/problemnew/show/P3367 并查集可以支持的操作:“并”和“查”。然后这道题主要就是考察这两种操作。将每一个点的“父亲”初始化为自己,然后分别进行“并”和“查”。 “并”:用递归函数fin…

MySQL使用学习使用,mysql学习--基本使用_MySQL

一旦安装完成,MySQL 服务器应该自动启动。sudo start mysql #手动的话这样启动sudo stop mysql #手动停止当你修改了配置文件后,你需要重启 mysqld 才能使这些修改生效。要想检查 mysqld 进程是否已经开启,可以使用下面的命令:pgr…

解决@vue/cli 创建项目是安装chromedriver时失败的问题

最近在使用新版vue的命令行工具创建项目时,安装chromedriver老是失败,导致后面的步骤也没有进行。网上搜索了一下,全是使用 npm install chromedriver --chromedriver_cdnurlhttp://cdn.npm.taobao.org/dist/chromedriver 安装的&#xff0c…

Java 8 Friday Goodies:Lambda和排序

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了…

npm 包下载的各种姿势

最近在写Node程序的时候,突然对 npm install 的-save和-save-dev 这两个参数的使用比较混乱。其实博主在这之前对这两个参数的理解也是模糊的,各种查资料和实践后对它们之间的异同点略有理解。遂写下这篇文章避免自己忘记,同时也给node猿友一…

39.数组中数值和下标相等的元素

题目描述: 假设一个单调递增的数组里的每个元素都是整数且是唯一的,请编程实现一个函数,找出数组中任意一个数值等于其下标的元素,例如,在数组{-3,-1,1,3,5}中数字3和它的下标相同。 思路分析: …

php读取xml标签内容,从xml php5获取内容

我正在研究一个支付解决方案,需要一些关于php的帮助。我正在做一个httprequest,作为回应,我将得到一些xml。XML可能如下所示:1description121510authurlsettleurl基本上我想做的是从标签中获取内容并将其保存为字符串。我试过这个:$order <?xml version"1.0" en…

jquery3和layui冲突导,致使用layui.layer.full弹出全屏iframe窗口时高度152px问题

项目中使用的jquery版本是jquery-3.2.1&#xff0c;在使用layui弹出全屏iframe窗口时&#xff0c;iframe窗口顶部总是出现一个152px高的滚动窗口无法实现真正全屏&#xff0c;代码如下&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-…

ADF Faces。 立即的自定义客户端事件

在本文中&#xff0c;我将重点介绍ADF Faces Javascript API方法以从客户端触发自定义事件。 例如&#xff1a; function cliListener(actionEvent) {AdfCustomEvent.queue(actionEvent.getSource(), "servListener",null, true);}我们可以使用af&#xff1a;client…

react-native页面间传递数据的几种方式

1. 利用react-native 事件DeviceEventEmitter 监听广播 应用场景&#xff1a; - 表单提交页面&#xff0c; A页面跳转到B页面选人&#xff0c; 然后返回A页面&#xff0c; 需要将B页面选择的数据传回A页面。 - 多个多媒体来回切换播放&#xff0c;暂停后二次继续播放等问题。…

php数据库操作类的调用优化,PHP PDO优化数据库操作类 多数据库驱动类

就是做一下整理 PHP PDO类操作。简化操作流程更多内容http://git.oschina.net/youkuiyuan/yky_test/blob/master/class/pdo.class.php点击链接加入群【微信开发探讨群】&#xff1a;http://jq.qq.com/?_wv1027&kcsNcd9群号&#xff1a;330393916欢迎浏览&#xff1a;www.z…

Genymotion模拟器安装ARM架构编译应用失败解决方案

我们在安装一些应用到Genymotion模拟器会提示&#xff1a;adb: failed to install xx.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res-113] 原因是Genymotion采用的编译方式是x86&#xff0c;默认不支持ARM架构编译的应用&#xff0…

CentOS7.5 yum 安装与配置MySQL5.7.24

安装环境&#xff1a;CentOS7 64位 MINI版&#xff0c;安装MySQL5.7 1、配置YUM源 在MySQL官网中下载YUM源rpm安装包&#xff1a;https://dev.mysql.com/downloads/repo/yum/ 下面已经提供一个YUM源安装包,如果不需要特定版本可直接使用我提供的5.7.24版本 # 下载mysql源安装包…

5种改善服务器日志记录的技术

在最近的时间里&#xff0c;我们已经看到了许多工具可以帮助您理解日志。 诸如Scribe和LogStash之类的开源项目&#xff0c;诸如Splunk之类的本地工具以及诸如SumoLogic和PaperTrail之类的托管服务。 这些都可以帮助您将大量日志数据减少为更有意义的内容。 它们共有一个共同点…

在vue项目中引用element-ui时 让el-input 获取焦点的方法

在制作项目的时候遇到一个需求&#xff0c;点击一个按钮弹出一个input输入框&#xff0c;并让输入框获得焦点&#xff0c;项目中引用了element-ui 在网上查找了很多方法&#xff0c;但是在实际使用中发现了一个问题无论是使用$ref获取input元素然后使用focus方法还是使用饿了么…