您的位置:首页 > 其它

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

2016-04-07 15:56 405 查看
因为某个需求,需要在添加一个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,完成了转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  interceptor cxf