JAX-RS 2.0:自定义内容处理

我试图想到一个更好的标题,但未能拿出一个! 请多多包涵……。

JAX-RS 2.0规范允许我们无缝地将JAXB对象编组到HTTP请求/响应主体/从HTTP请求/响应主体中解组。 简而言之,我们可以使用域对象,而不必担心基于JAX-RS的解决方案中的低级XML序列化。

在开始之前, 这是指向下面引用的源代码的GitHub链接 –数量不多,但是以防万一,您需要窥视一下。

开发环境

  • Java EE 7(当然!)
  • JDK 8-不要激动,到目前为止还没有lambda!
  • Netbeans 8
  • Wildfly 8和GlassFish 4(是的,已经在两台服务器上都进行了测试)–它仅用于在Netbeans中切换服务器,并且花费大约15-30秒的黑白时间。 因此,这没什么大不了的!

首先,让我们看一下用例,这些用例演示了JAX-RS实现的开箱即用功能,以便通过网络处理带有JAXB注释的实体/域对象。

这是一个简单的示例,其中我们尝试“ 获取 ”域对象的表示,该对象恰好是JAXB 注释的 POJO

2

当我们触发GET HTTP请求时,将获得以下JSON响应 。 这里使用的工具是邮递员

1个

同样,也可以通过简单地切换“ 接受”来观察XML响应。   HTTP标头到application / xml

3

让我们看一下一种情况,其中我们尝试通过网络“ 发布 ”域对象(XML / JSON)的表示形式

4

通过邮递员启动POST请求

6

服务器日志中STDOUT的代码段(按照上面的代码)

5

因此,我们刚刚看到,在JAXRS中,装饰有JAXB批注的域对象可以在网上交换XML和JSON格式而不会费劲!

考虑一个场景,在该场景中我们已经可以使用丰富的域Java对象。 但

  • 我们无权访问源代码
  • 我们无法真正使用JAXB批注对其进行批注
  • 域实体是不兼容JAXB的旧式POJO。

在这里,我们可以利用JAX-RS 2.0中提供的自定义内容处理功能MessageBodyWriterMessageBodyReader接口为我们提供了一种插入自定义编组/解组机制的方式,并允许JAX-RS运行时处理其余工作!

  • 下面的示例主要处理XML和JSON格式,但是请注意,这些接口可用于“任何”数据格式-互联网上到处都是数百种,每天都有新的接口出现!

让我们看一些代码。 。 。 。 再次…..

首先,为了模拟get场景,让我们仅从JAXRS资源方法返回Legacy POJO的实例它与JAXB不兼容 /我们没有通过JAXB批注装饰它的源代码

7

您如何看待这将通过网络串行化为XML ? 我们对javax.ws.rs.ext.MessageBodyWriter接口的定制实现将有助于实现这一点。

此接口具有3个抽象方法,一个需要实现。 该片段展示了writeTo()方法,该方法包含大部分转换逻辑。

8

因此,和往常一样,我们要求邮递员为我们验证事情,这就是他不得不说的。 不用麻烦! 想象一下,如果直接从持久性(DB)存储中获取旧版POJO表示形式–您需要做的就是将其返回,因为在线表示形式已得到处理。

9

现在,相反的情况–从我们的客户端层发布 XML表示,并观察它被序列化到Legacy POJO实例中。 想坚持吗? 当然,继续执行并解雇实体管理器! (不要忘记@ javax.ejb.Stateless !)

101

您如何看待客户端发送XML有效负载通过网络转换为我们的Leagcy POJO 实例 ? 我们对javax.ws.rs.ext.MessageBodyReader接口的自定义实现将使这种情况发生。

13

呼叫Postman,通过网络发布 XML表示,然后查看结果

11

只是为了确保我们的旧版POJO确实已序列化– 通过服务器STDOUT日志进行了确认

12

因此,在一个简单的示例的帮助下,我们看到了在基于JAXRS的实现中定义用于处理自定义域对象/实体/ POJO的 自定义转换/类包装逻辑的简便性。

签字之前的几点观察

  • GlassFish4 中的 JAXRS实现不支持通过装饰有JAXB的POJO进行无缝JSON序列化/反序列化Wildfly 8的魅力十足 ! 荣誉!
  • 在将marshall / unmarshall流程委派给实体拦截器(读取器/写入器实现)后,无缝JSON支持停止工作(在GlassFish和Wildfly中均是如此)。 不知道为什么。 我猜想JAXRS实现是直接从/分别将有效负载取回/将有效负载写入到输入/输出流,并且某种程度上没有中间层可用于内容协商

我希望我不会在这里错过任何把戏! 如果您这样认为,请足够热情地通知我!

好吧,仅此而已! 编码愉快…………!

翻译自: https://www.javacodegeeks.com/2014/04/jax-rs-2-0-custom-content-handling.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值