一般如何处理 CXF 请求处理程序中的输入参数?

2024-05-08

我一直在使用 apache CXF(版本 2.2.2)JAX-RS 进行一些工作。我试图在调用业务方法之前在 CXF 请求处理程序中引入数据验证层。幸运的是:),我在请求处理程序(DataValidationHandler)中遇到输入参数处理问题。我可以通过遵循请求处理程序中的代码行来手动读取 JSON 对象。但它与 CXF 框架中注册的 JSONProvider 重复。因为JSON对象输入流只能读取一次,否则我们会遇到异常“java.io.EOFException:由于输入结束而没有内容可以映射到对象”。此外,重复的 JSON 对象反序列化会影响性能。以下代码是示例供您参考。

手动从 HTTP 正文读取 JSON 对象:

OperationResourceInfo ori = paramMessage.getExchange().get(OperationResourceInfo.class);
MultivaluedMap<String, String> values = new MetadataMap<String, String>();
List<Object> objList = JAXRSUtils.processParameters(ori, values, paramMessage);

在CXF JAX-RS框架中注册JSONProvider:

<bean id="JSONProvider" class="com.accela.govxml2.jaxrs.util.JSONProvider"></bean>

从输入流读取 JSON 对象到 Java 对象:

public Object readFrom(......){
    ObjectMapper objectMapper = new ObjectMapper();
    Object result = objectMapper.readValue(entityStream, TypeFactory.defaultInstance().constructType(genericType));
    Return result;
}

我正在通过以下代码行手动处理路径参数。

OperationResourceInfo ori = paramMessage.getExchange().get(OperationResourceInfo.class);
URITemplate t1 = ori.getClassResourceInfo().getURITemplate();
URITemplate t2 = ori.getURITemplate();
UriInfo uriInfo = new UriInfoImpl(paramMessage, null);
MultivaluedMap<String, String> map = new MetadataMap<String, String>();
t1.match(uriInfo.getPath(), map);
String str = map.get(URITemplate.FINAL_MATCH_GROUP).get(0);
t2.match(str, map);
String pathParameter= null;
if (map.containsKey("pathParam") && !ValidationUtil.isEmpty(map.get("pathParam")))
{
    pathParameter= map.get("pathParam").get(0);
}

我的问题在这里:

  1. 一般如何处理请求处理程序中 http body 的 POST/PUT 输入参数?
  2. 如何避免性能问题以有效读取输入参数?
  3. 有没有办法在CXF(JSONProvider)读取参数和业务方法调用之间注入验证(处理程序/拦截器)层?
  4. 有没有优雅的方法来处理路径参数?

感谢您的帮助。任何意见和建议将不胜感激。

问候, 迪伦


我找到了另一种将 DataValidation Interceptor 注入读取参数阶段的方法。我们可以重用消息内容中的反序列化输入模型,这些模型由框架中注册的 JSONProvider 进行反序列化。它可以提高性能,因为只需反序列化输入模型一次。

public class DataValidationInInterceptor extends AbstractPhaseInterceptor<Message>
{
public DataValidationInInterceptor()
{
    super(Phase.READ);
}

@Override
public void handleMessage(Message message)
{
    OperationResourceInfo ori = message.getExchange().get(OperationResourceInfo.class);
    Method method = ori.getMethodToInvoke();
    Class<?>[] types = method.getParameterTypes();
    Type[] genericParameterTypes = method.getGenericParameterTypes();

    for (int i = 0; i < types.length; i++)
    {
        Class<?> type = types[i];
        List obj = (List) message.getContent(List.class);
        System.out.println(obj);
        System.out.println(type);
    }
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一般如何处理 CXF 请求处理程序中的输入参数? 的相关文章

  • 在java中将RFC3339 DateTime转换为Date [重复]

    这个问题在这里已经有答案了 如何转换RFC 3339 https www rfc editor org rfc rfc3339java 中的 com google api client util DateTime 到 DateTime 例如
  • 使用 TreeMap 和 Comparator 按值对 HashMap 进行排序

    我使用以下代码创建哈希图 然后使用树形图和比较器对哈希图中的值进行排序 然而 输出结果却出乎意料 所以任何关于我做错了什么的想法都会有帮助 Code public static void main String args System ou
  • 使用 Nginx 时缺少 HTTP 状态代码名称

    我正在使用 Nginx 将所有 HTTP 请求重定向到 HTTPS 在我的 Spring Boot 应用程序中 这是我正在使用的 nginx 配置 通过它我可以将所有请求重定向到 Https 但是当我这样做时 我得到了状态码返回正确 但没有
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 使用Java获取CSS文件中图像的URL?

    我正在尝试使用 Java 获取远程 CSS 文件中图像 所有 MIME 类型 的 URL 我正在使用 jsoup 来获取 css 的 URL 经过无数个小时的观看CSS解析器 http cssparser sourceforge net 由
  • IntelliJ Ultimate 在 Play 2.3 (Java) 项目测试中找不到路由

    虽然我的测试运行得很好 但 IntelliJ 抱怨它找不到路由对象 并且代码自动完成无法工作 我已经查看了所有文档 这应该可以工作 这是 IntelliJ 的报告内容 关于我的项目配置可能有什么问题有什么想法吗 这很可能与以下事实有关 ro
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • @Cachable 在没有输入参数的方法上?

    我有问题 org springframework cache annotation Cachable注解 Bean public ConcurrentMapCache cache return new ConcurrentMapCache
  • IntSummaryStatistics的summaryStatistics方法

    为什么空 IntStream 上的 summaryStatistics 方法返回整数的最大和最小值作为流中存在的最大和最小 int 值 IntStream intStream IntStream of IntSummaryStatistic
  • 解密 TLS 1.2 AES-GCM 数据包

    我正在开发一个 Java 程序来解密TLS 1 2正在使用的会话TLS RSA WITH AES 128 GCM SHA256密码 我使用wireshark 录制了一个测试会话 这大师秘密是已知的 No Time Protocol Leng
  • 在 Java Swing 元素中使用 HTML 样式是不好的做法吗?

    使用 HTML 设置 Swing 元素的样式被认为是不好的做法吗 举个例子 如果我想让标签变大并变红一次 我有两个选择 使用 API 调用 JLabel label new JLabel This is a title label setF
  • 在 JavaFX 中更改 ListView 字体大小

    我想知道如何更改 JavaFx 中的列表视图项目文本字体大小 每行文本的大小会有所不同 我尝试使用细胞因子属性 但我不知道如何使用它 有人可以帮我吗 类似的问题在这里 如何更改JavaFX中ListView的字体大小 https stack
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • java.lang.ClassCastException: [B 无法转换为 java.lang.String

    我编写了一个带有字段 LoginId 和密码的实体类 我使用 AES ENCRYPT 加密密码并将其存储在数据库中 我只想检索已解密的密码 所以 我使用 AES DECRYPT 使用本机查询是在 OPen JPA 2 0 中 我写的查询是
  • 使用 InputStream 通过 TCP 套接字接收多个图像

    每次我从相机捕获图像时 我试图将多个图像自动从我的 Android 手机一张一张地发送到服务器 PC 问题是read 函数仅在第一次时阻塞 因此 从技术上讲 只有一张图像被接收并完美显示 但在那之后当is read 回报 1 该功能不阻塞
  • 如何从Java中的连接获取查询字符串?

    我正在编写一个方法 尝试记录数据库调用 形成连接到它的连接 在查询之后 有很多地方调用方法 connect 来启动并调用 cleanUp 方法来结束 我不能并且不想修改每个地方 所以顺序是这样的 Connection con connect
  • Java 应用程序启动,ProcessBuilder 一段时间后被阻止

    我正在开发一个 Java 桌面应用程序 我们称之为控制台 包含 3 个按钮 其中两个启动 Win32 应用程序 第三个应该启动一个可执行的 jar ProcessBuilder pb new ProcessBuilder java jar
  • 用 lambda 表达式替换匿名函数

    我在 Java 8 映射操作中传递一个函数 Intellij 告诉我它可以用 lambda 表达式替换 但我不知道如何在不创建中间对象结构的情况下做到这一点 这就是我所做的 List
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 如何在 Restful Web 服务中指定一系列数据或多个实体

    要访问 Restful Web 服务中的 User 实例 URL 的结构如下面的curl 请求所示 curl v X GET s BASE URL User customer id json 如果我想指定所有用户实体或对一系列用户实体进行分

随机推荐

  • HTML-Entity 转义以防止 XSS

    我有一些用户输入 在我的代码中 我确保对以下符号进行转义 gt amp lt gt lt gt gt gt OWASP https www owasp org index php XSS 28Cross Site Scripting 29
  • 扑。如何检查自动续订订阅是否仍然有效

    我的应用程序有 1 个月的自动续订订阅 当用户单击 购买订阅 按钮时 我将购买日期保存到共享首选项中 然后 1 个月后 我需要检查该订阅是否仍然有效 那么我该如何实施呢 2020 年 3 月 11 日更新 你好 我可以看到那些正在寻找如何在
  • 从云函数在 Google Cloud Storage 中创建新的 csv 文件

    第一次使用 Google 云存储 下面我有一个云函数 每当 csv 文件上传到时就会触发该函数my folder在我的桶里 我的目标是在同一文件夹中创建一个新的 csv 文件 读取上传的 csv 的内容并将每一行转换为将进入新创建的 csv
  • 在 Alpine 中找不到运行时/cgo

    In an alpine edge我安装的容器通过 RUN apk add no cache musl dev go 我试着跑go get github com golang protobuf protoc gen go then 这会导致
  • 来自完整 HTML 文档的 jQuery 对象

    是否可以将完整的 HTML 文档解析为完整的 jQuery 对象 当我尝试时 例如 var tmp p test p console log tmp I get title p test 即一个数组 将所有头部的子项与所有身体的子项组合起来
  • 将数组传递给 json.stringify

    我试图将数组传递给 json stringify 但返回的值返回为空 JSON stringify json data returns json 这是数据的内容 data from email protected cdn cgi l ema
  • Capistrano 杀死资产:预编译

    我正在尝试部署我的应用程序 但我不断收到 err xxx xxx xx xxx bash line 1 9953 Killed bundle exec rake RAILS ENV production RAILS GROUPS asset
  • AWS lambda只读文件系统错误,使用docker镜像存储ML模型

    我在 lambda 上使用 docker 容器映像来运行我的 ML 模型 我的 lambda 函数有一个 S3 触发器来获取图像 我正在尝试运行 lambda 函数 但收到此错误 有人可以帮帮我吗 PS 现在我知道 tmp 是 lambda
  • 同时支持 CommonJS 和 AMD

    有没有办法创建一个 javascript 微型库 没有依赖项的库 支持以下所有模块格式 异步模块定义 CommonJS 将库的导出公开为全局命名空间对象 无加载程序 是的 我把这个答案归功于ded https github com ded
  • C# - 捕获 RTP 流并发送到语音识别

    我正在努力实现的目标 在 C 中捕获 RTP 流 将该流转发到 System Speech SpeechRecognitionEngine 我正在创建一个基于 Linux 的机器人 它将接受麦克风输入 将其发送给 Windows 机器 Wi
  • PlayFramework:如何转换 JSON 数组的每个元素

    鉴于以下 JSON values one two three 我如何在 Scala Play 中像这样转换它 values elem one elem two elem three 这很容易Play 的 JSON 转换器 https www
  • 启动 Java 时使用 -d32 和 -d64

    我阅读了以下摘录JDK 常见问题解答 http www oracle com technetwork java hotspotfaq 138619 html 64bit layering 如何在 32 位和 64 位操作之间进行选择 默认是
  • C++ 包装类的设计

    我必须使用一个界面非常笨拙的旧类 由于我无法更改它并且依赖它 因此我想构建一个包装器 提供一个干净的界面 假设我有课笨手笨脚的班级 基本上 我有三种方法 1 参考会员 Class Wrapper public Wrapper ClumsyC
  • 准备好的语句什么时候会失败? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我一直在搞乱MySQLi对象在PHP 并且习惯于在执行语句之前准备语句 到目前为止 我主要做了以下事情 if stmt mysqli
  • ImageMagick 更改图像宽度和高度

    我正在使用 ImageMagick 通过使用下面的命令行选项来调整图像分辨率 convert abc png set units PixelsPerInch density 75 abc a png 我需要这个 如果任何图像的宽度超过 30
  • 我应该向所有内容添加类/id,还是使用其他选择器

    我永远不确定选择元素的最佳 最有效 方法是什么 假设我有以下布局 非常简单的示例 div ul li Link 1 li li Link 2 li li Link 3 li ul div 我想选择我的无序列表 确保我不会影响整个网站中的任何
  • Matplotlib 未在前两个子图中显示 xlabel

    我编写了一个函数来在此处显示一些图表 def plot price series df ts1 ts2 price series line graph fig plt figure ax1 fig add subplot 221 ax1 p
  • 将 Spark 数据框中的时间戳转换为日期

    我见过 这里 如何将DataFrame中的时间戳转换为日期格式 https stackoverflow com questions 40656001 how to convert timestamp to date format in da
  • 错误 C2248: 'CObject::CObject' : 无法访问类 'CObject' afxwin.h 中声明的私有成员

    我试图让班级负责在灰色背景上放置一些文本 Score h pragma once class Score public Score Score void UpdateScore int points void UpdateLives int
  • 一般如何处理 CXF 请求处理程序中的输入参数?

    我一直在使用 apache CXF 版本 2 2 2 JAX RS 进行一些工作 我试图在调用业务方法之前在 CXF 请求处理程序中引入数据验证层 幸运的是 我在请求处理程序 DataValidationHandler 中遇到输入参数处理问