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,一经查实,立即删除!

相关文章

智能驾驶板块_智能驾驶股票有哪些?智能驾驶股票一览

智能驾驶股票有哪些?智能驾驶板块5月8日午后拉升,华东数控(002248)涨停,伊之密(300415)、斯莱克(300382)股价大涨超过9%,中南建设(000961)涨逾4%,高新兴(300098)涨幅超过3%,汇川技术(300124)、亚威股份(002559)、亚太…

调整w7计算机屏幕一直亮,win7系统电脑屏幕不休眠保持常亮状态设置的操作方法...

很多小伙伴都遇到过对1.首先我们点开始-控制面板,打开控制面板2.在控制面板中找到“电源选项”,点击进入3.然后根据你的选择,我这边选择的是平衡,则在平衡的右边点击更改计划设置,自己是哪一项就选哪一项对应的更改计划…

java文章上一篇下一篇_每个人都必须阅读的10篇Java文章

java文章上一篇下一篇一个月前,我们发布了每个人都必须阅读的10篇SQL文章列表。 我们相信jOOQ博客上的文章列表将为我们的读者带来非凡的价值。 jOOQ博客是一个专注于Java和SQL的博客,因此,很自然地,一个月后的今天,我…

【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…

n76e885_新唐N76E003,N76E616烧录,调试各种问题集【坑集】

新唐N76E003,N76E616烧录,调试各种问题集【坑集】芒果 • 2018 年 10 月 24 日这篇博文用来记录学习新唐单片机时遇到的问题以及解决的过程和方法。当然也有各种坑。希望这篇文章有机会能够帮助到遇到到同样问题的朋友。1. **可以和STC单片机一样使用串口…

注解默认继承_默认方法和多重继承

注解默认继承最近卢卡斯JOOQ埃德尔发布和文章有关嵌套类及其使用。 这是一个有趣的话题,他的文章一如既往地有趣并且值得一读。 只有一个简短的声明我无法同意,我们有一个简短的回复链,导致了默认方法,以及为什么不能有类似的东西…

暑期社会实践服务器维护,寒假网络维护社会实践报告

今年由于来学校返校报到的时间比较晚,我早到学校一星期了,就在学校附近的网吧做了一星期的网络维护社会实践,把一星期实践所学到的东西和遇到的问题做个总结:一、网络简介网络按照地域可分为:局域网、城域网与广域网。…

信工干货||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(官网链接),它可以将高强…

maven 可执行 jar_Maven提示:有关可执行jar的所有信息

maven 可执行 jarMaven提示:有关可执行jar的所有信息 可执行jar是分发代码时非常有用的工具。 这意味着,只要将Java安装在客户端计算机上,至少在Windows和Mac上,您的用户只需双击jar即可启动程序。 或者,在命令行上&am…

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

发布时间: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日的网课核心内容摘录,因内容较多,分三个系列发布,包括:系列之一、为什么政策突变?系列之二、联合体是什么?系列之三、联合体如何联…

netflix_学习Netflix管理员–第1部分

netflix最近几天,我一直在与Netflix Governator合作,并尝试使用Governator尝试一个小样本,以将其与Spring Framework的依赖项注入功能集进行比较。 以下内容并不全面,我将在下一系列文章中对此进行扩展。 因此,对于没…

laravel ajax ip,怎么在Laravel中利用AJAX动态刷新部分页面

怎么在Laravel中利用AJAX动态刷新部分页面发布时间:2021-02-17 13:12:43来源:亿速云阅读:119作者:Leah怎么在Laravel中利用AJAX动态刷新部分页面?很多新手对此不是很清楚,为了帮助大家解决这个难题&#xf…

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

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

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

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