cdi-api_使用CDI简化JAX-RS缓存

cdi-api

这篇文章(通过一个简单的示例)说明了如何使用CDI Producers使其在RESTful服务中利用缓存控制语义更加容易

与HTTP 1.0中可用的Expires标头相比, HTTP 1.1中添加了Cache-Control标头,这是急需的改进。 RESTful Web服务可以利用此标头来扩展其应用程序并使它们更有效,例如,如果您可以缓存先前请求的响应,那么如果您确定要对某个请求进行响应,那么显然无需再次向服务器发出相同请求您缓存的数据不是陈旧的事实!

JAX-RS有何帮助?

自其初始(1.0)版本以来, JAX-RS就已经支持Cache-Control标头。 CacheControl类表示现实世界中的Cache-Control HTTP标头,并提供了通过简单的setter方法配置标头的功能。 JAX-RS 2.0 javadocs中有关CacheControl类的更多信息

jaxrs缓存控制

那么我该如何使用

只需返回一个Response对象,即可围绕它包装 CacheControl类的实例。

@Path("/testcache")
public class RESTfulResource {@GET@Produces("text/plain")public Response find(){CacheControl cc = new CacheControl();cc.setMaxAge(20);return Response.ok(UUID.randomUUID().toString()).cacheControl(cc).build();}
}

尽管这对于单个方法来说相对方便,但是重复创建和返回CacheControl对象可能会激怒多个方法

CDI生产者来抢救!

CDI生产者可以帮助注入类的实例,这些类在技术上不是Bean (按照严格的定义),或者对于您用范围和限定符修饰它们时无法控制的类。

这个想法是为了

  • 有一个自定义注释( @CacheControlConfig )来定义Cache-Control标头的默认值,并在您要覆盖它时提供灵活性
    @Retention(RUNTIME)
    @Target({FIELD, PARAMETER})
    public @interface CachControlConfig {public boolean isPrivate() default true;public boolean noCache() default false;public boolean noStore() default false;public boolean noTransform() default true;public boolean mustRevalidate() default true;public boolean proxyRevalidate() default false;public int maxAge() default 0;public int sMaxAge() default 0;}
  • 只需使用CDI Producer通过使用InjectionPoint对象(由CDI高兴地注入!)来创建CacheControl类的实例,具体取决于注释参数
    public class CacheControlFactory {@Producespublic CacheControl get(InjectionPoint ip) {CachControlConfig ccConfig = ip.getAnnotated().getAnnotation(CachControlConfig.class);CacheControl cc = null;if (ccConfig != null) {cc = new CacheControl();cc.setMaxAge(ccConfig.maxAge());cc.setMustRevalidate(ccConfig.mustRevalidate());cc.setNoCache(ccConfig.noCache());cc.setNoStore(ccConfig.noStore());cc.setNoTransform(ccConfig.noTransform());cc.setPrivate(ccConfig.isPrivate());cc.setProxyRevalidate(ccConfig.proxyRevalidate());cc.setSMaxAge(ccConfig.sMaxAge());}return cc;}
    }
  • 只需 CacheControl实例注入您的REST资源类中,并在您的方法中使用它
    @Path("/testcache")
    public class RESTfulResource {@Inject@CachControlConfig(maxAge = 20)CacheControl cc;@GET@Produces("text/plain")public Response find() {return Response.ok(UUID.randomUUID().toString()).cacheControl(cc).build();}
    }

其他想法

  • 在这种情况下,产生的CacheControl实例的范围是@Dependent,即它将与注入它的类一起生存和死亡。 在这种情况下,由于JAX-RS容器为每个客户端请求创建了一个新实例,因此JAX-RS资源本身是RequestScoped (默认),因此将与每个HTTP请求一起创建注入的CacheControl实例的新实例。
  • 您还可以引入CDI限定词以进一步缩小范围并考虑极端情况
  • 您可能会认为,使用JAX-RS过滤器可以实现相同的目的。 那是正确的。 但是您需要手动设置Cache-Control标头(在可变的MultivaluedMap中),并且逻辑不够灵活,无法解决不同情况下的不同Cache-Control配置

实验结果

使用NetBeans IDE播放此示例(推荐)

  • 部署WAR并浏览到http:// localhost:8080 / JAX-RS-Caching-CDI / testcache
  • 随机字符串,将被缓存20秒 (根据@CacheControl批注的配置)

    初始请求

  • 对相同URL的GET请求不会导致服务器端REST服务的调用。 浏览器将返回缓存的值。

    第二个请求

尽管代码很简单,但是如果您觉得很懒,可以从这里获取(maven)项目并在其中玩转

玩得开心!

翻译自: https://www.javacodegeeks.com/2015/02/simplifying-jax-rs-caching-with-cdi.html

cdi-api

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

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

相关文章

【C语言】结构体赋值

结构体在 C 程序中使用的较为频繁,能对数据有一定的封装的作用。对一个结构体赋值时,经常采用的方式是,分别对其成员变量赋值。那么能否将一个结构体用赋值号(“”)直接赋值给另一个结构体呢?网上的答案不一…

vue 传参 微信_vue-router 你可能忽略的知识点

vue-router相信大家都不陌生,并且很多都有实战经验。可能有很多你忽略的一些点。1、丑陋的hash值vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。const router new VueRouter(…

适合计算机64位的cad,【1人回答】求一个能适用于CAD2008的纬地,我的电脑是Win7 64位的-3D溜溜网...

回答:下载方法:1、建立临时目录,如 CAD20082、下载AutoCAD2008安装软件,将文件复制到CAD2008目录下。3、将 CAD2008 文件夹中的 zh-cn 文件夹改名为 en-us;4、下载“AutoCAD 2008 64 位补丁包(下载地址:ACA…

C |格式化输出与变量类型

C语言 格式化输出与变量类型 1、格式化输出在PHP里面,我们一般都是用echo和var_dump以及print_r等来输出调试语句,在C语言中一般用printf来输出,不过由有点特殊,你需要在输出的时候指定输出的数据类型:#in…

信工干货||C语言输入输出语句

数据输入与输出C语言无I/O语句,I/O操作由函数实现putchar( ) getchar( ) printf( ) scanf( ) puts( ) gets( )#include或#include “stdio.h”数据输出字符输出函数格式:putchar(c)参数:c为字符型或整型常量、变量或表…

如何设置网件gs108e_Netgear 网件 EAX80 AX6000规格 无线扩展器 开箱拆解评测

前言众所周知,国行网件RAX系列默认中国区,这就导致了路由器的发射功率不会高,所以很多人觉得国行RAX无线路由器信号覆盖不尽如意。为了解决这个问题,本次为大家介绍一款WiFi 6信号扩展器—EAX80(官网链接),它可以将高强…

饥荒海难创建显示专用服务器,饥荒创建世界时一直显示启动服务器 | 手游网游页游攻略大全...

发布时间:2017-08-07TGP版怎么建立服务器呢?各位知道在TGP里如何创建服务器吗?这里给大家带来了TGP版服务器创建开服方法,教大家TGP如何创建服务器,还不会的玩家,一起来了解下吧. >&gt ...标签:攻略发布时间:2015-12-20联机过程中有…

C语言 | 6种常用的转换工具函数盘点

字符串转十六进制代码实现:void StrToHex(char *pbDest, char *pbSrc, int nLen){ char h1,h2; char s1,s2; int i; for (i0; i2; i) { h1 pbSrc[2*i]; h2 pbSrc[2*i1];s1 toupper(h1) - 0x30; //toupper 转换为大写字母 if (s1 > 9) s1…

企业联合体的形式_联合体如何联合?——总包新政下,联合体如何联合?系列三...

以下文字为根据科思顿企业咨询管理(上海)有限公司合伙人胡建于2020年4月10日的网课核心内容摘录,因内容较多,分三个系列发布,包括:系列之一、为什么政策突变?系列之二、联合体是什么?系列之三、联合体如何联…

vue2 怎么用vite_Vue2和Vue3开发组件有什么区别

我们一直都有关注和阅读很多关于Vue3的新特性和功能即将到来。但是我们没有一个具体的概念在开发中会有如何的改变和不一样的体验。还有一些童鞋已经开始又慌又抓狂了 -- “又要开始学新的写法了 (ノToT )ノ ~┻┻”。所以这里我使用Vue2和Vue3开发一个简单的表格组件来展示一下…

C语言中实现边沿函数算法及应用,这是抛弃PLC留下的痛!

很多从事PLC编程的朋友都知道,不管是什么品牌的PLC,都有上升沿和下降沿指令。❤那么什么情况下我们才会使用或必须使用边沿信号呢?边沿信号我们又如何获取呢?如图1,任何一个开关信号(或数字信号&#xff09…

服务器系统装驱动精灵,云服务器安装驱动精灵

云服务器安装驱动精灵 内容精选换一换您可以选择在云服务器上安装一个或多个应用。如需在云服务器上安装其他应用,请参考如下操作进行添加。暂时仅允许支持VR应用的云服务器安装VR应用。暂时仅允许支持3D应用的云服务器安装3D应用。暂时仅允许支持VR应用的云服务器有…

注入器 过检测_连云港管道检测服务

连云港管道检测服务 管道稀释淤泥施工时应采用专业高压水车将两个检查井注入室内灌水,并使用挖泥机将检查井中的污泥与排污管混合,以稀释污泥为目的. 如果是手工作业应与机械作业配合以不断搅拌污泥,直到将其稀释到水中为止.管道吸污。 公司备…

lock.lock_HibernateCascadeType.LOCK陷阱

lock.lock介绍 引入了Hibernate 显式锁定支持以及Cascade Types之后 ,就该分析CascadeType.LOCK行为了。 Hibernate锁定请求触发内部LockEvent 。 关联的DefaultLockEventListener可以将锁定请求级联到锁定实体子级。 由于CascadeType.ALL也包括CascadeType.LOCK …

浅谈面向对象思想下的 C 语言

如何使用OO思维方式面向对象(object Oriented,简称:OO)在于用“找对象”的方式去规划和描述问题。一、怎样“找对象” (思维过程)“对象”是具有共性的一个群体。以 L298N 控制马达的官方推荐方法为例,控制的共性在于&…

我的世界服务器里怎么无限随机传送,我的世界随机传送插件使用教程 权限指令分享...

导读:在我的世界中玩家可以利用随机传送插件来进行传送人物质与设定点,那么随意传送插件该如何使用呢、下面小编我就来教教各位,我的世界随意传送插件使用教程。什么是RandomLocationRandomLocation让你传送到预设区域的随机位置。可以通过命…

热敏电阻温度特性曲线_NTC热敏电阻如何选型

什么是NTCNTC 热敏电阻是负温度系数的电阻,其特性是电阻值随着温度的升高而呈下降趋势。这个与PTC或者PT100等正温度系数的热敏电阻相反。NTC 热敏电阻NTC的阻值-温度对应曲线如下图所示(100K为例,B值3950)。NTC 热敏电阻R-T曲线下面介绍选型原则。2.根据…

如何使用C语言的面向对象?

我们都知道,C 才是面向对象的语言,但是C语言是否能使用面向对象的功能?(1)继承性typedef struct _parent{int data_parent;}Parent;typedef struct _Child{struct _parent parent;int data_child;}Child;在设计C语言继承性的时候,我们需要做…

t3软件怎么生成报表_临沂用友畅捷通T3财务通软件财税一体化

用友T3财税通针对财税一体化的发展趋势,在用友通上海财税专版的基础上,经过完善和提高。同时加入了税务核算功能、所得税汇算功能。 财税通财务软件的财税同步处理,可将事后税务处理的汇总涉税数据工作化整为零,分解到日常凭证填制…

每日干货丨C语言知识总结----循环结构

介绍循环结构可以看成是一个条件判断语句和一个向回 转向语句 的组合。另外,循环结构的三个要素:循环变量、 循环体 和循环终止条件. ,循环结构在 程序框图 中是利用判断框来表示,判断框内写上条件,两个出口分别对应着…