拦截JAX-RS Web服务请求以添加JSON字段

拦截JAX-RS Web服务请求以添加JSON字段,第1张

概述我有一个JAX-RS Web服务,它返回一个获取 JSON请求参数(映射到Parameter对象),如下所示(它在WebLogic 12.2.1中运行).是否可以编写拦截器或过滤器,这样当调用Web服务时,它将在JSON请求消息中添加一个额外的字段,以便下面的方法将在requestParameters中获得额外的字段? @POST@Consumes(MediaType.APPLICATION_J 我有一个JAX-RS Web服务,它返回一个获取 JSON请求参数(映射到Parameter对象),如下所示(它在WebLogic 12.2.1中运行).是否可以编写拦截器或过滤器,这样当调用Web服务时,它将在JsON请求消息中添加一个额外的字段,以便下面的方法将在requestParameters中获得额外的字段?

@POST@Consumes(MediaType.APPliCATION_JsON)@Produces(MediaType.APPliCATION_JsON)@Path("LogIn")public Response logIn(@Context httpServletRequest request,Parameters requestParameters) {...}

谢谢!

解决方法 拦截器

它可以通过拦截器实现.

拦截器旨在通过 *** 纵实体输入/输出流来 *** 纵实体.拦截器有两种,ReaderInterceptorWriterInterceptor.

读取器拦截器用于 *** 纵入站实体流.这些是来自“电线”的流.因此,使用读取器拦截器,您可以在服务器端 *** 纵请求实体流. Writer拦截器用于将实体写入“wire”的情况,服务器在写出响应实体时表示

以下拦截器实现了ReaderInterceptor接口,允许您在服务器端修改请求的实体:

@ProvIDerpublic class CustomreaderInterceptor implements ReaderInterceptor {    @OverrIDe    public Object aroundReadFrom(ReaderInterceptorContext context)                       throws IOException,WebApplicationException {        inputStream stream = context.getinputStream();        // Manipulate the http entity using the inputStream        context.setinputStream(stream);        return context.proceed();    }}

请注意,上面的拦截器是全局的,也就是说,它将针对所有资源方法执行.

使用Jackson时,您的ReaderInterceptor#aroundReadFrom(ReaderInterceptorContext)方法实现可能如下:

// Create a Jackson ObjectMapper instance (it can be injected instead)ObjectMapper mapper = new ObjectMapper();// Parse the requested entity into a JsON treeJsonNode tree = mapper.readTree(context.getinputStream());// Add a property to the JsON((ObjectNode) tree).put("fIEld","value");// Set the input stream containing the manipulated JsONcontext.setinputStream(new ByteArrayinputStream(mapper.writeValueAsBytes(tree)));// Proceed to the next interceptor in the chaincontext.proceed();

名称绑定

要仅为某些手工挑选的资源方法执行拦截器,可以使用名称绑定.

名称绑定是一种概念,它允许向JAX-RS运行时说明仅针对特定资源方法执行特定过滤器或拦截器.当过滤器或拦截器仅限于特定的资源方法时,我们说它是名称绑定的.

可以使用@NameBinding批注将过滤器分配给资源方法.注释用作应用于提供者和资源方法的其他用户实现的注释的元注释.

名称绑定注释可以定义如下(注释的名称取决于您):

@nameBinding@Retention(RUNTIME)@Target({TYPE,METHOD})public @interface CustomizeResponse { }

将上面定义的注释放在拦截器类上:

@ProvIDer@CustomizeResponsepublic class CustomreaderInterceptor implements ReaderInterceptor {    ...}

要将拦截器分配给资源方法,请将以上定义的注释放在资源方法上:

@GET@CustomizeResponse@Produces(MediaType.APPliCATION_JsON)public Response myMethod() {    ...}

名称绑定也可以应用于资源类.这意味着将为该资源类的所有资源方法执行拦截器:

@Path("/foo")@CustomizeResponsepublic class MyResource() {    ...}

请注意,始终执行全局过滤器和拦截器,因此即使对于具有任何名称绑定注释的资源方法也是如此.

其他资源

有关拦截器的更多详细信息,请查看Jersey documentation.

总结

以上是内存溢出为你收集整理的拦截JAX-RS Web服务请求以添加JSON字段全部内容,希望文章能够帮你解决拦截JAX-RS Web服务请求以添加JSON字段所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1045417.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存