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