使用CDI简化JAX-RS缓存

这篇文章(通过一个简单的示例)说明了如何使用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

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

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

相关文章

transform限制position:fixed的跟随效果

我们应该都知道,position:fixed可以让元素不跟随浏览器的滚动条滚动,而且这种跟随效果连它的兄弟们position:relative/absolute都限制不了。但是,真是一物降一物,position:fixed固定效果却被小小的transform给干掉了,直…

Java 8 Lambda表达式教程

问候! :) 离开几个月后,我决定恢复风格:)。 我注意到我以前有关新的Date / Time API的一篇文章非常受欢迎,因此这次我将把本篇文章专门介绍Java 8的另一个新功能: Lambda Expressions 。 功能编程 Lambda表达式是Java编程语言最…

[HDU] 2553 N皇后问题-简单深搜

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid2553 方法: 1.可以用对称的思想,即:如果N是偶数,则只计算第一个皇后分别放在第一行的位置1到N/2这N/2个情况的结果和,最后再乘以2。如果是奇数&#…

您真的了解@WebService吗?

SOAP Web服务无论如何都不是最先进的技术-尽管它仍然存在,但是基于REST的Web服务却提供了激烈的竞争。 无论如何–这绝对不是REST vs SOAP帖子! 我观察到了一些实例,至少可以说,使用基于Java的SOAP Web服务的方式不太理想。 我认…

Error: Module “xxx“ does not exist in container. / antd pro v5启用qiankun报错 / 同时使用mfsu和qiankun报错

一、问题描述 我们用antd pro v5搭建前端项目,启用qiankun微前端模式,终端报错如下: Uncaught (in promise) Error: Module “xxx” does not exist in container. while loading “xxx” from webpack/container/reference/mf 经过排查&…

双链表

问题:在分配空间时,遇到问题 定义一个结构体: typedef struct dLinkListNode{ int data; struct dLinkListNode *prior; struct dLinkListNode *next;}*dLinkList,dListNode; dList(dLinkList)malloc(sizeof(dListNode));与dList(dLinkList)m…

JVMTI标记如何影响GC暂停

这篇文章分析了为什么Plumbr Agents在某些情况下以及如何延长GC暂停的时间。 对基本问题进行故障诊断揭示了有关在GC暂停期间如何处理JVMTI标记的有趣见解。 发现问题 我们的一位客户抱怨说,附加了Plumbr代理后,应用程序的响应速度明显降低。 通过分析G…

使用Apache Hadoop计算PageRanks

目前,我正在接受Coursera的培训“ 挖掘海量数据集 ”。 我对MapReduce和Apache Hadoop感兴趣已有一段时间了,通过本课程,我希望对何时以及如何MapReduce可以帮助解决一些现实世界中的业务问题有更多的了解(我在这里介绍了另一种解…

分享一篇关于奇异值分解的文章[Eng]

原文地址:http://www.igvita.com/2007/01/15/svd-recommendation-system-in-ruby/ One day, a bunch of friends, who happened to be big Family Guy fans, decided to put together a site to rank and share their thoughts on the show. Soon thereafter they h…

为雅安祈福

四川是个多灾多难的省份,更是个多地震的省份,十年之内发生了两次大地震。我们能做的就是为雅安的人们祈福。 淘宝给互联网带头了: 天猫也跟着祈福了,因为他们都属于阿里巴巴,这里就不上图了。 百度作为国内互联网企业的…

在运行时打开GC日志记录

总是有下一个JVM表现不佳。 而且,您内心深知,如果您只有少数启动选项可以公开一些有关正在发生的事情的信息,那么您可能就有机会真正修复该死的东西。 但是不,您需要的标志( -XX: HeapDumpOnOutOfMemoryErr…

jpannel设置位置xy_实用的摄影技巧!10种常见摄影场景的单反相机设置技巧!

相机是爱拍一族必不可少的东西,对于摄影爱好者对于一些相机设置技巧可能也不是太了解,在摄影过程中,有很多的场景需要不同的设置,根据光线变化和周围环境,一般来说都会特定的摄影技巧,今天红视觉和大家一起…

Only digits (0-9) can be put inside [] in the path string: formData.XXX

使用uniapp开发时微信小程序中爆出的问题,问题在于form表单组件中绑定表单值,去除报错值则正常。 解决办法如下: 修改注释行内容, 转载连接

外包以小时计算金额的费用_2020年初级会计各大税种的计算公式,请收藏!

一、各种税的计算方式增值税1、一般纳税人应纳税额销项税额—进项税销项税额销售额税率组成计税价格成本(1成本利润率)组成计税价格成本(1成本利润率)(1-消费税税率)2、进口货物应纳税额组成计税价格税率组成计税价格关税完税价格关税(消费税)3、小规模纳税人应纳税额销售额征收…

VSCode设置ESLint语法检查

转载 "eslint.validate": ["javascript","javascriptreact","vue-html",{"language": "vue","autoFix": true}],"eslint.run": "onSave","eslint.autoFixOnSave": true…

次要GC,主要GC与完整GC

在使用Plumbr中的GC暂停检测功能时,我被迫通过大量有关该主题的文章,书籍和演示工作。 在整个旅程中,我多次对次要,主要和完全GC事件的使用(误用)感到困惑。 这导致了这篇博客文章,我希望我设法…

怎么改字段名称_精装房这么改!换门框,封阳台,效果出来比毛坯房还好

最近有朋友后台留言,称自己原本想一步到位购买精装房,但收房验收时才发现根本不合心意,空间利用率太低配色也老气,已经打算重新改装了。所谓精装房就是开发商将地板、门、厨房、卫生间、少量天花和部分柜子进行安装,业主只要添加些…

ZF2系列 – Zend Framework 2 MVC實作 (Part 3)

我之所以這麼喜歡Zend Framework的關係,其中一項就是它可以幫你很簡單的實現MVC的架構,所以今天的任務就是要建立一個以MVC為架構的基本網頁。 首先當然要先建立一個測試用的資料庫,因此我簡單的建立了一個名為Employee的資料表來進行展示&am…

方向盘左右能摇动_学车这么久了,你还不会打方向盘呢?

刚刚学车的朋友肯定有过这样的问题:教练说:往左打两圈,往右打一圈,往左打半圈……你乖乖听话照做,然后教练说:回正吧。是不是一下就蒙住了??我刚才打几圈来着?&#xff1…

Asp.Net基础 - 9.Web开发原则

目录: 9.1.Web开发的一些基本原则 9.2 原则一 9.2.1 C#代码是运行在服务器端的,JS代码是运行在浏览器客户端的 9.2.2 在服务器端“弹出消息窗口” 9.2.3 案例说明(客户端与服务端互不影响) 9.3 原则二 9.4 原则三 9.4.1 客户端…