返回值是内置类型 不能更改_选择通过更改内容类型返回的详细程度,第二部分...

返回值是内置类型 不能更改

在上一篇文章中 ,我们研究了如何使用MOXy的功能来控制特定实体的数据输出级别。 这篇文章着眼于Jersey 2.x提供的抽象,它允许您定义一组自定义的批注以具有相同的效果。

与之前一样,我们几乎没有什么琐碎的资源可以返回Jersey会为我们转换为JSON的对象,请注意,目前此代码中没有任何内容可以进行过滤–我不会将注释传递给
Response对象,如Jersey示例中所示:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;@Path("hello")
public class SelectableHello {@GET@Produces({ "application/json; level=detailed", "application/json; level=summary", "application/json; level=normal" })public Message hello() {return new Message();}
}

在我的设计中,我将定义四个注释: NoViewSummaryViewNormalViewDetailedView 。 所有根对象都必须实现NoView注释,以防止暴露未注释的字段-您可能觉得设计中没有必要。 所有这些类看起来都一样,所以我只显示一个。 请注意,创建AnnotationLiteral的工厂方法必须优先于创建动态代理以具有相同效果的工厂使用。 2.5中有代码,将忽略由java.lang.reflect.Proxy对象实现的任何注释,其中包括您可能从类中检索到的所有注释。 我正在为此提交修复程序。

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;import javax.enterprise.util.AnnotationLiteral;import org.glassfish.jersey.message.filtering.EntityFiltering;@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EntityFiltering
public @interface NoView {/*** Factory class for creating instances of the annotation.*/public static class Factory extends AnnotationLiteral<NoView> implements NoView {private Factory() {}public static NoView get() {return new Factory();}}}

现在,我们可以快速浏览一下Message Bean,这比我以前的示例稍微复杂一点,以非常简单的形式显示子图的过滤。 正如我之前说过的那样,在类的根部使用NoView注释进行注释–这应该意味着privateData永远不会返回给客户端,因为它没有特别注释。

import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement
@NoView
public class Message {private String privateData;@SummaryViewprivate String summary;@NormalViewprivate String message;@DetailedViewprivate String subtext;@DetailedViewprivate SubMessage submessage;public Message() {summary = "Some simple summary";message = "This is indeed the message";subtext = "This is the deep and meaningful subtext";submessage = new SubMessage();privateData = "The fox is flying tonight";}// Getters and setters not shown
}public class SubMessage {private String message;public SubMessage() {message = "Some sub messages";}// Getters and setters not shown
}

如前所述,资源类中没有用于处理过滤的代码–我认为这是一个横切关注点,因此我将其抽象为WriterInterceptor。 请注意,如果使用的实体没有NoView批注,则会抛出该异常。

import java.io.IOException;import java.lang.annotation.Annotation;import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;import javax.ws.rs.ServerErrorException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.WriterInterceptor;
import javax.ws.rs.ext.WriterInterceptorContext;@Provider
public class ViewWriteInterceptor implements WriterInterceptor {private HttpHeaders httpHeaders;public ViewWriteInterceptor(@Context HttpHeaders httpHeaders) {this.httpHeaders = httpHeaders;}@Overridepublic void aroundWriteTo(WriterInterceptorContext writerInterceptorContext) throws IOException,WebApplicationException {// I assume this case will never happen, just to be sureif (writerInterceptorContext.getEntity() == null) {writerInterceptorContext.proceed();return;}else{Class<?> entityType = writerInterceptorContext.getEntity().getClass();String entityTypeString = entityType.getName();// Ignore any Jersey system classes, for example wadl//if (entityType == String.class  || entityType.isArray() || entityTypeString.startsWith("com.sun") || entityTypeString.startsWith("org.glassfish")) {writerInterceptorContext.proceed();return;}// Fail if the class doesn't have the default NoView annotation // this prevents any unannotated fields from showing up//else if (!entityType.isAnnotationPresent(NoView.class)) {throw new ServerErrorException("Entity type should be tagged with @NoView annotation " + entityType, Response.Status.INTERNAL_SERVER_ERROR);}}// Get hold of the return media type://MediaType mt = writerInterceptorContext.getMediaType();String level = mt.getParameters().get("level");// Get the annotations and modify as required//Set<Annotation> current = new LinkedHashSet<>();current.addAll(Arrays.asList(writerInterceptorContext.getAnnotations()));switch (level != null ? level : "") {default:case "detailed":current.add(com.example.annotation.DetailedView.Factory.get());case "normal":current.add(com.example.annotation.NormalView.Factory.get());case "summary":current.add(com.example.annotation.SummaryView.Factory.get());}writerInterceptorContext.setAnnotations(current.toArray(new Annotation[current.size()]));//writerInterceptorContext.proceed();}
}

最后,您必须手动启用EntityFilterFeature,为此,您可以在Application类中简单地注册它

import java.lang.annotation.Annotation;import javax.ws.rs.ApplicationPath;import org.glassfish.jersey.message.filtering.EntityFilteringFeature;
import org.glassfish.jersey.server.ResourceConfig;@ApplicationPath("/resources/")
public class SelectableApplication extends ResourceConfig {public SelectableApplication() {packages("...");// Set entity-filtering scope via configuration.property(EntityFilteringFeature.ENTITY_FILTERING_SCOPE, new Annotation[] {NormalView.Factory.get(), DetailedView.Factory.get(), NoView.Factory.get(), SummaryView.Factory.get()});register(EntityFilteringFeature.class);}}

一旦一切就绪并运行,应用程序将像以前一样响应:

GET .../hello Accept application/json; level=detailed or application/json
{"message" : "This is indeed the message","submessage" : {"message" : "Some sub messages"},"subtext" : "This is the deep and meaningful subtext","summary" : "Some simple summary"
}GET .../hello Accept application/json; level=normal
{"message" : "This is indeed the message","summary" : "Some simple summary"
}GET .../hello Accept application/json; level=summary
{"summary" : "Some simple summary"
}

这是直接使用MOXy注释的更好选择–使用自定义注释应该更容易将应用程序移植到过度实现中,即使您必须提供自己的过滤器也是如此。 最后,值得探讨的是Jersey扩展,它允许基于角色的筛选 ,我认为这在安全方面很有用。

参考: 通过改变内容类型来选择返回的详细程度,第二部分来自我们的JCG合作伙伴 Gerard Davison,位于Gerard Davison的博客博客中。

翻译自: https://www.javacodegeeks.com/2014/02/selecting-level-of-detail-returned-by-varying-the-content-type-part-ii.html

返回值是内置类型 不能更改

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

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

相关文章

[渝粤教育] 中国地质大学 嵌入式操作系统 复习题 (2)

《嵌入式操作系统》模拟题 一.单选题 1./babys目录属于project群组(group)并设置了1770的访问权限.而project群组的成员如下: #group dog cat foxdog: dog projectcat:cat project fox:fox project请问以上每一个用户具有对/babys目录中其他用户的文件和目录的有效访问权限是哪…

武警多业务光端机,五防光端机产品介绍

产品描述 本系列产品&#xff0c;是在该公司研制的专用超大规模集成电路的基础上&#xff0c;研发的点对点多业务光传输设备。此款产品提供4路视频&#xff0c;1-4路电话接口&#xff1b;1-16路开关量接口/1-8路RS232-422-485接口&#xff1b;4路千兆以太网接口&#xff08;共享…

sts 创建webservice项目_Eclipse Maven生成WebService客户端代码及测试

条件:1. Eclipse安装Axis2插件2. 导入Web Service相关包创建Maven项目导入axis2相关jar包xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">4.0.0com.soapsoap0.0.1-SNAPSHOTsoap-clientdom4jdom4j1.6.1org.a…

[渝粤教育] 中国地质大学 建筑艺术赏析 复习题

《建筑材料赏析》模拟题 一.单选题 1.离狮身人面像最近的金字塔是() A.胡夫金字塔 B.海夫拉金字塔 C.门卡乌拉金字塔 2.中国的古典建筑属于() A.砖石结构系统 B.木结构系统 C.水泥结构系统 3.伊什达门是巴比伦城的()门 A.东 B.南 C.西 D.北 4.底比斯的卡纳克阿蒙神庙是在古埃…

J2Pay –入门

入门将指导您如何通过非常简单的步骤快速开始使用J2pay。 下载 J2Pay在Maven上可用。 <dependency><groupId>com.tranxactive</groupId><artifactId>j2pay</artifactId><version>2.4.0</version></dependency>您也可以在此…

[渝粤教育] 中国地质大学 操作系统原理(新) 复习题

《操作系统原理》模拟题 选择题 1.UNIX操作系统是一个()操作系统. A.实时 B.单用户多任务 C.多道批处理 D.多用户多任务 2.Unix系统采用的文件目录结构是(). A.一级目录结构 B.二级目录结构 C.多级目录结构 D.索引目录结构 3.操作系统是一组()程序 A.文件管理 B.中断处理 C.资…

[渝粤教育] 中国地质大学 材料力学 复习题 (2)

《材料力学》模拟题 一单选题 1.直径为d的圆截面拉伸试件其标距是(). A.试件两端面之间的距离 B.试件中段等截面部分的长度 C.在试件中段的等截面部分中选取的”工作段”的长度其值为5d或10d D.在试件中段的等截面部分中选取的”工作段”的长度其值应大于10d 2.轴向拉伸的应力…

与kylin_什么是Kylin,Kylin的学习

概述Kylin定义Apache Kylin是一个开源的分布式分析引擎&#xff0c;提供Hadoop/Spark之上的SQL查询接口及多维分析(OLAP)能力以支持超大规模数据&#xff0c;最初由eBay开发并贡献至开源社区。它能在亚秒内查询巨大的Hive表。Kylin架构1)REST ServerREST Server是一套面向应用程…

工业轨式 1-16路 4-20MA 模拟量光端机产品介绍

产品描述 本系列设备采用大规模FPGA设计&#xff0c;采用独创技术&#xff0c;可同时支持 1~8 通道模拟量信号&#xff08;电流/电压&#xff09;到光纤中继&#xff0c;每组模拟量有24V供电输出VO脚&#xff0c;方便给传感器等设备供电。该设备采用双电源供电&#xff0c;高性…

[渝粤教育] 中国地质大学 电力系统保护原理 复习题 (2)

《电力系统保护原理》模拟题 一单选题 1.()是为补充主保护和后备保护的性能或当主保护和后备保护退出运行而增加的简单保护. A.异常运行保护 B.辅助保护 C.失灵保护 2.()的出现是区分正常运行、过负荷、系统震荡及相间短路的基本特征. A.正序分量 B.负序分量 C.零序分量 D.均可…

js移除某个class_用JS添加和删除class类名

下面介绍一下如何给一个节点添加和删除class名添加&#xff1a;节点.classList.add("类名")&#xff1b;删除&#xff1a;节点.classList.remove("类名")&#xff1b;以tab切换为例&#xff1a;在写tab切换的时候&#xff0c;通常我们会给选中的tab设置不同…

采购光纤收发器时应该注意哪些事项?

目前市场上国外和国内生产光纤收发器的厂商很多&#xff0c;产品线也极为丰富&#xff0c;光纤收发器的种类也不一&#xff0c;主要分为机架式光收发器、台式光收发器和卡式光收发器。在实际的采购中&#xff0c;企业考虑的一个重要的因素是价格。当然&#xff0c;除价格外同时…

scala集合转java_Java,Scala,Guava和Trove集合-它们可以容纳多少数据?

scala集合转java关于我们的数据结构的一个有趣的事情是&#xff0c;即使我们非常熟悉它们&#xff0c;但对于我们来说&#xff0c;仍然很难说出像HashMap这样基本的东西在1GB的内存中可以容纳多少个项目。 我们可能会在学校&#xff0c;高级开发人员那里学到这一点&#xff0c;…

[渝粤教育] 中国地质大学 结晶学与矿物学 复习题 (2)

《结晶学与矿物学》模拟题 一单选题 1.Al2SiO5的三种同质多象变体中()形成于中高压变质带的低温部分. A.红柱石 B.蓝晶石 C.矽线石 D. 2.斑铜矿表面出现的蓝紫斑驳的颜色为(). A.自色 B.假色 C.他色 D.表面色 3.常见的石英是(). A.α&#xff0d;石英 B.β&#xff0d;石英 …

单模单纤的光纤收发器A、B端的位置可以互换吗?

单纤光纤收发器&#xff1a;接收发送的数据在一根光纤上传输顾名思义&#xff0c;单纤设备可以节省一半的光纤&#xff0c;即在一根光纤上实现数据的接收和发送&#xff0c;在光纤资源紧张的地方十分适用。那么&#xff0c;单模单纤的光纤收发器A、B端的位置可以互换吗&#xf…

WTF连接池

让我们谈谈连接池。 我声称&#xff1a; 大多数流行的连接池的默认设置都很差&#xff01; 对您来说&#xff0c;这意味着&#xff1a; 去查看您的连接池设置。 如果您依赖默认设置&#xff0c;则可能会遇到问题。 您可能有内存泄漏和应用程序无响应&#xff08;即使负载根…

安卓跑linux程序_Android下运行Linux可执行程序

2019-07-22关键字&#xff1a;/system/bin/sh: xxx: No such file or directory虽然说 Android 也是基于 Linux 的&#xff0c;但总归来说它们的编译链还是很有可能不一样的&#xff0c;这就导致编译出来的程序有可能不能通用&#xff0c;即使它们都是基于 Linux 的。而有些不能…

[渝粤教育] 中国地质大学 计算机文化基础 复习题

《计算机文化基础》模拟题 一、单项选择题 1.自然界中常见的光能够由()三种颜色混合而成. A.红黄绿 B.红绿蓝 C.澄蓝紫 D.白红绿 2.显示器彩电等成像显示设备的工作是基于()三色原理. A.RYG(红黄绿) B.WRG(白红绿) C.RGB(红绿蓝) D.CMY(青品红黄) 3.PentiumIICPU是()位处理器…

最常见的SQL报错注入函数(floor、updatexml、extractvalue)及payload总结

SQL报错注入是一种常见的SQL注入攻击方式&#xff0c;攻击者通过注入恶意代码&#xff0c;触发数据库的错误响应&#xff0c;并从错误信息中获取有用的信息。 下面介绍最常见的三个报错注入函数用法及payload总结&#xff1a; 1、floor() 使用floor报错注入&#xff0c;需要…

光电转换器与光纤收发器有哪些区别?

说到光电转换器&#xff0c;我们都知道光电转换器是一种类似于基带MODEM&#xff08;数字调制解调器&#xff09;的设备&#xff0c;和基带MODEM不同的是接入的是光纤专线&#xff0c;是光信号&#xff0c;分为全双工流控&#xff0c;半双工背压控制。那么&#xff0c;光电转换…