如何使用@Context批注

JAX-RS API提供了一种非常方便的机制,可以将各种有用的资源(例如HTTP标头)注入到端点中。 @Context注释是一个通用注释,它注入以下对象的实例:

  • HttpHeaders- > HTTP标头参数和值
  • UriInfo- >捕获路径变量和查询参数
  • SecurityContext- >提供对请求的安全性相关信息的访问
  • ResourceContext- >提供对资源类实例的访问
  • 请求 ->前提条件请求处理
  • 应用程序配置提供程序 ->提供有关JAX-RS应用程序环境的信息
  • HttpServletRequest- >提供对HttpServletRequest实例的访问
  • HttpServletResponse- >提供对HttpServletResponse实例的访问
  • ServletConfig- >提供对ServletConfig的访问
  • ServletContext- >提供对ServletContext的访问

让我们依次使用工作代码示例进行研究。

使用@Context注入HttpHeaders实例

有两种获取HTTP标头参数值的方法。 如果可以使用@HeadParam批注标记资源方法参数并将其传递给参数名称,则将HTTP标头参数的值分配给由@HeadParam批注注释的String变量。 以下代码片段检索user-agent参数的值并将其分配给UserAgent String。

@HeaderParam("user-agent") String userAgent

如果您只需要几个头值,那么这是一个很好的解决方案,但是如果您想要很多或不确定参数名需要遍历头,那该解决方案还不够好。 幸运的是, @ Context注释可以帮助我们。 该注释可以将所有HTTP标头参数注入一个HttpHeaders对象中。 看下面的代码示例:

@Path("/http-headers")
public class EndpointResource {@GET@Produces(MediaType.APPLICATION_JSON)public Response getAllHttpHeaders(final @Context HttpHeaders httpHeaders){return Response.ok(httpHeaders.getRequestHeaders()).build();}
}

在此代码段中, @ Context批注用于指示容器将当前请求的HttpHeaders对象的实例传递给getAllHttpHeaders方法。 方法getRequestHeaders返回一个包含HTTP参数及其对应值的MultivaluedMap <String,String> 。 这是为当前请求提供对HTTP标头数据的访问的许多方法之一。

MultivaluedMap被反序列化为JSON,并在响应主体中发送回客户端。

如果您将代码克隆到我的Github存储库中,并使用Maven命令: mvn clean package执行代码,它将被部署到IBM Liberty Profile实例中。 访问URL http:// localhost:8080 / rest-server / http-headers ,该请求的HTTP标头的JSON表示将显示在屏幕上,其外观应类似于以下内容:

{"Accept": [ "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8" ],"accept-encoding": [ "gzip, deflate, br" ],"Accept-Language": [ "en-US,en;q=0.8,es;q=0.6" ],"connection": [ "keep-alive" ],"Content-Type": [ null ],"DNT": [ "1" ],"Host": [ "localhost:8080" ],"Upgrade-Insecure-Requests": [ "1" ],"User-Agent": ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"]
}

让我们看另一个仅检索一个HTTP标头值的示例。

@GET
@Path("/{header-param}")
@Produces(MediaType.APPLICATION_JSON)
public Response getSpecifiedHeader(final @PathParam("header-param") String header_param, final @Context HttpHeaders httpHeaders){return Response.ok(httpHeaders.getRequestHeader(header_param)).build();
}

在此编码示例中,您通过URL参数将HTTP标头参数名称传递给资源方法。 然后,该方法使用参数名称来检索关联的HTTPHeader参数的值,并将其以JSON格式传递回调用方。

因此,对端点http:// localhost:8080 / rest-server / http-headers / User-Agent的调用将返回User-Agent HTTP参数的值,并且应如下所示:

["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36"
]

HttpHeader类中有很多方法,可让您查询HTTP标头中的参数。 这是这些方法的列表。 如您所见,有一些便捷的方法可以返回MediaTypeLocal

List<String> getRequestHeader(String var1);
String getHeaderString(String var1);
MultivaluedMap<String, String> getRequestHeaders();
List<MediaType> getAcceptableMediaTypes();
List<Locale> getAcceptableLanguages();
MediaType getMediaType();
Locale getLanguage();
Map<String, Cookie> getCookies();
Date getDate();
int getLength();

HttpHeaders实例也可以作为实例变量注入,如下所示:

@Path("/http-headers")
public class HttpHeaderResource {@Contextprivate HttpHeaders httpHeaders;@GET@Produces(MediaType.APPLICATION_JSON)public Response getAllHttpHeaders(){return Response.ok(httpHeaders.getRequestHeaders()).build();}
}

使用@Context注入UriInfo实例

UriInfo接口提供对有关请求URI的有用信息的访问。 您可以检索与路径相关的详细信息,例如查询参数是路径变量。

以下代码段在资源根后面获取URI中的模板参数。

@Path("/uri-info")
public class UriInfoResource {@GET@Path("/{path: .*}")@Produces(MediaType.APPLICATION_JSON)public Response getPathParameters(final @Context UriInfo uriInfo){return Response.ok(uriInfo.getPathParameters()).build();}}

访问URL http:// localhost:8080 / rest-server / uri-info / path / to / resource后收到的响应是资源根uri-info之后的路径。

{"path": [ "path/to/resource" ]
}

可以通过调用方法getQueryParameters()轻松检索URI查询参数。 看下面的代码示例。

@GET
@Path("/{search}")
@Produces(MediaType.APPLICATION_JSON)
public Response getQueryParameters(final @Context UriInfo uriInfo){return Response.ok(uriInfo.getQueryParameters()).build();
}

对URL http:// localhost:8080 / rest-server / uri-info / search?term = JavaEE的调用将捕获搜索项和值:

{"term": [ "JavaEE" ]
}

也可以将UriInfo实例注入实例变量中,如下所示:

@Context
private UriInfo uriInfo;

接下来是什么?

这就是什么什么是javax.ws.rs.core.context? 您将学习如何使用@Context批注来保护RESTful Web服务以及如何检索和使用资源。

代码库

这个以及我所有文章的源代码都在readlearncode_articles Github存储库中。

翻译自: https://www.javacodegeeks.com/2017/08/javax-ws-rs-core-context-part-1.html

什么是javax.ws.rs.core.context? [ 第1部分 ]相关推荐

  1. 什么是javax.ws.rs.core.context? [第3部分]

    如何使用@Context批注 在什么是javax.ws.rs.core.context的第2部分中? 您学习了如何使用@Context批注从SecurityContext类的注入实例检索安全信息,以及 ...

  2. 什么是javax.ws.rs.core.context? [ 第2部分 ]

    如何使用@Context批注 在什么是javax.ws.rs.core.context? 您学习了如何使用@Context批注从HttpHeaders类的注入实例中检索HTTP标头信息,以及如何从Ur ...

  3. 什么是javax.ws.rs.core.context? [第5部分]

    如何使用@Context批注 在什么是javax.ws.rs.core.context的第4部分中? 您学习了如何使用@Context批注将HttpServletResponse和HttpServle ...

  4. 什么是javax.ws.rs.core.context? [第4部分]

    如何使用@Context批注 在什么是javax.ws.rs.core.context的第3部分中? 您学习了如何在请求和配置,提供程序和应用程序实例中使用@Context批注. 在本文中,您将学习如 ...

  5. Couldn‘t find grammar element for class javax.ws.rs.core.Response(没有解决)

    复现: $HADOOP_HOME/bin/yarn timelineserver 12月 22, 2020 3:21:49 下午 com.sun.jersey.server.wadl.generato ...

  6. Couldn‘t find grammar element for class javax.ws.rs.core.Response

    测试hive on tez,启动顺序如下: 启动hadoop hive --service metastore hiveserver2 starthis yarn timelineserver hiv ...

  7. 【registry】registry AbstractMethodError javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws

    1.概述 在 [registries]registrie rest-service idea 无法引入的背景下,以及 [registry]NoSuchFieldError: INCLUDE_ALL 以 ...

  8. javax maven项目缺少_Eclipse项目中的Maven:软件包javax.ws.rs不存在

    在Eclipse中,当我转到myProject->右键单击-> Run As-> Maven构建时,控制台中出现多个错误,概述某些软件包不存在,例如: javax.ws.rs doe ...

  9. flink启动yarn-session报错javax/ws/rs/ext/MessageBodyReader

    问题复现: /home/appleyuchi/bigdata/flink-1.10.1/bin/yarn-session.sh 报错如下: 2020-06-07 19:05:01,358 ERROR ...

最新文章

  1. 年终盘点:2015年人工智能的五大关键词
  2. linux 用户/用户组添加修改删除(ubuntu/centos)
  3. 17秋 软件工程 团队第五次作业 Alpha Scrum3
  4. VC++6.0如何创建与调用动态链接库(dll)
  5. OpenCL(CUDA5.0) + Visual Studio 2010 环境配置
  6. ES10新特性_数组方法扩展flat_与flatMap---JavaScript_ECMAScript_ES6-ES11新特性工作笔记059
  7. 二进制安装 kubernetes 1.12(四) - 部署 Node 节点组件
  8. android11 谷歌安装器,gms安装器安卓11版2021最新版-安卓11gms安装器2021最新版v4.8.5华为专版_新绿资源网...
  9. Dynamic resolution 动态分辨率 相机系列6
  10. 软件测试的风险分析与解决办法
  11. java代码耗尽内存_为什么运行Java应用程序的计算机几乎耗尽了物理内存,但仍然可以运行数周...
  12. Axure幻灯片案例
  13. IE 浏览器中不能使remove删除节点的解决方法
  14. 计算机科学与技术专业就业方向及前景如何?
  15. js 日期增加加天数计算
  16. mp4格式封装工具MP4Box(十一)
  17. 【SQL注入漏洞-04】布尔盲注靶场实战
  18. android icloud云盘,icloud备份恢复到安卓手机(全方面了解iCloud轻松玩转iCloud)
  19. 用 Go 构建一个区块链 -- Part 2: 工作量证明
  20. java poi预览word文档_apache poi操作office文档----java在线预览txt、word、ppt、execel,pdf代码...

热门文章

  1. MySQL 调优/优化的 101 个建议!
  2. 3分钟了解“关联规则”推荐
  3. 漫画:什么是一致性哈希
  4. Java Excel导出
  5. ssm使用全注解实现增删改查案例——applicationContext-servlet.xml
  6. 最全三大框架整合(使用映射)——IDeptDao.java
  7. Python缩进的几个原则
  8. 2019蓝桥杯省赛---java---A---8(修改数组)
  9. mybatis-plus 错误java.lang.NoClassDefFoundError: org/apache/velocity/context/Context
  10. Centos7安装apt-get 在centos下用yum install xxx        不是使用apt-get