InputStream在MessageBodyReader Jersey中提供空数据

时间:2016-11-29 16:37:01

标签: java web-services rest spring-boot jersey

我试图在泽西岛的 if (Build.VERSION.SDK_INT >= 24) { textView.setText(Html.fromHtml(htmlString , Html.FROM_HTML_MODE_LEGACY))); } else { textView.setText(Html.fromHtml(htmlString)); } 中阅读APPLICATION_FORM_URLENCODED。当我尝试使用MessageBodyReader

读取它时,流返回空数据

这是我的代码:

BufferedReader

我可以看到数据是在{@ 1}}的POST请求中从我的表单发送的,但是我无法在@Consumes(MediaType.APPLICATION_FORM_URLENCODED) public class EmployeeReader implements MessageBodyReader<Employee> { @Override public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return true; } @Override public Employee readFrom(Class<Employee> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException, WebApplicationException { System.out.println(entityStream.available()); //Prints 0 BufferedReader br = new BufferedReader(new InputStreamReader(entityStream)); String data = br.readLine(); System.out.println("Stream Read:"+data); //data is null here ..... } } 中读取它。

调试时我可以看到ByteChunk持有以下数据:

application/x-www-form-urlencoded

更新

我发现它是MessageBodyReader的某种副作用。禁用此选项会导致上述代码正常工作。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

在请求到达表单数据和n = int(raw_input("Enter a number:")) x = [1:n+1] def work(n): print range(x) 请求的代码之前,显然有一个HiddenHttpMethodFilter getParameter。因此,POST已被阅读且InputStream正在返回br.readLine();

我找到了一种在其他帖子here

中覆盖此方法的方法
null

这样做只是检查请求是否为@Configuration public class FilterConfig { @Bean public HiddenHttpMethodFilter hiddenHttpMethodFilter() { return new HiddenHttpMethodFilter() { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { if ("POST".equals(request.getMethod()) && request.getContentType().equals(MediaType.APPLICATION_FORM_URLENCODED)) { //Skip this filter and call the next filter in the chain. filterChain.doFilter(request, response); } else { //Continue with processing this filter. super.doFilterInternal(request, response, filterChain); } } }; } } 类型,如果MediaType是POST,如果是,那么我们跳过过滤器链的这一部分,否则对所有其他请求我们也处理这个过滤器。

这样,APPLICATION_FORM_URLENCODED到达InputStream

时将无法读取