因为某个需求,需要在添加一个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,完成了转换。