加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:34:37 所属栏目:Java 来源:网络整理
导读:我一直在使用apache CXF(版本2.2.2)JAX-RS做一些工作.我想在调用业务方法之前在CXF请求处理程序中引入数据验证层.幸运:),我在请求处理程序(DataValidationHandler)中遇到输入参数处理问题.我可以通过请求处理程序中的代码行手动读取 JSON对象.但它与在CXF框
我一直在使用apache CXF(版本2.2.2)JAX-RS做一些工作.我想在调用业务方法之前在CXF请求处理程序中引入数据验证层.幸运:),我在请求处理程序(DataValidationHandler)中遇到输入参数处理问题.我可以通过请求处理程序中的代码行手动读取 JSON对象.但它与在CXF框架中注册的JSONProvider重复.因为JSON对象输入流只能被读取一次,否则我们将遇到异常“java.io.EOFException:由于输入结束而没有内容映射到Object”.此外,重复的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体的POST / PUT输入参数?
>如何有效地避免性能问题来读取输入参数?
>有没有办法在CXF(JSONProvider)的参数读取和业务方法调用之间注入验证(处理程序/拦截器)层?
>有没有优雅的方法来处理路径参数?

谢谢你的帮助.任何评论&建议将不胜感激.

问候,
迪伦

解决方法

我找到了另一种将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);
    }
}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读