我一直在使用 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);
}
我的问题在这里:
- 一般如何处理请求处理程序中 http body 的 POST/PUT 输入参数?
- 如何避免性能问题以有效读取输入参数?
- 有没有办法在CXF(JSONProvider)读取参数和业务方法调用之间注入验证(处理程序/拦截器)层?
- 有没有优雅的方法来处理路径参数?
感谢您的帮助。任何意见和建议将不胜感激。
问候,
迪伦