使用vertx+jersey4.5.2做客户端api接口工程,在做微信回调的时候,其返回的数据Content-Type为text/xml,使用Consumes(MediaType.TEXT_XML)获取不到body中的数据,如下。
@Path("wxPayNotify")
@POST
@Consumes(MediaType.TEXT_XML)
@Produces(MediaType.TEXT_XML)
public String wxPayNotify(@Context HttpServerRequest request,String xml){...}
我做过其他的测试:使用@Consumes(MediaType.APPLICATION_XML)或者@Consumes(MediaType.TEXT_PLAIN),然后客户端用这两种类型是能获取到的,唯独MediaType.TEXT_XML获取不到,但是微信回调使用的是MediaType.TEXT_XML。如何才能获取到MediaType.TEXT_XML类型的数据?
通过debug调试,发现在DefaultJerseyHandler中的shouldReadData方法中,没有允许处理MediaType.TEXT_XML,添加上之后即可。
之前的代码为:
// Allow text/plain
if (MediaType.TEXT_PLAIN_TYPE.getType().equals(mediaType.getType())
&& MediaType.TEXT_PLAIN_TYPE.getSubtype().equals(mediaType.getSubtype())) {
return true;
}
修改后的代码为:
// Allow text/plain,text/xml,text/json
if (MediaType.TEXT_PLAIN_TYPE.getType().equals(mediaType.getType())) {
return true;
}
这样就允许
text/plain,text/xml,text/json等以text开头的Content-Type。
note:修改某些开源的jar包中源文件之后,既可以用编译后的class文件替换掉原来的文件,又可以将源文件拷贝至我们的源文件中,修改后要保持报名和类名一样,这样在加载的时候就会先加载我们的文件。