cxf Interceptor 转化 multipart/form-data类型数据

因为某个需求,需要在添加一个Interceptor,然后在Interceptor里面得到request里的parameter。但是发现数据的类型是multipart/form-data的。

google了好久没找到好的办法,最后发现FormUtils中有一个方法。

    public static Form readForm(FormEncodingProvider<Form> provider, Message message) 
        throws Exception {
        return provider.readFrom(Form.class, Form.class, 
                              new Annotation[]{}, MediaType.APPLICATION_FORM_URLENCODED_TYPE, 
                              new MetadataMap<String, String>(), 
                              message.getContent(InputStream.class));
    }

如上,它所传的是

MediaType.APPLICATION_FORM_URLENCODED_TYPE

发现MediaType中有一个MULTIPART_FORM_DATA_TYPE,所以想自己实现一个readForm。

public static Form readForm(FormEncodingProvider<Form> provider, Message message)
            throws Exception {
        return provider.readFrom(Form.class, Form.class,
                new Annotation[]{}, MediaType.MULTIPART_FORM_DATA_TYPE,
                new MetadataMap<String, String>(),
                message.getContent(InputStream.class));
}

但是这样不行,会报一个NullPointException。

@Context private MessageContext mc;

FormEncodingProvider实例里的mc为null,估计是某个地方自动装配的,但是因为对cxf并不是很熟悉,不知道怎么去得到FormEncodingProvider,只是new了一个,所以mc为null,而FormEncodingProvider又没有对mc进行设置的方法。

又发现一个得到MessageContext的方式

MessageContext mc = new MessageContextImpl(message);
所以最后写了一个类,通过反射机制把mc传到FormEncodingProvider的实例中。

            provider=FormEncodingProvider.class.newInstance();
            Class<FormEncodingProvider> clazz=FormEncodingProvider.class;
            Field field=clazz.getDeclaredField("mc");
            field.setAccessible(true);
            field.set(provider,mc);

最后得到了一个form,完成了转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值