如何通过FacesContext获取POST提交的原始JSON数据
获取JSF应用中text/plain格式的原始请求体
你用getRequestParameterMap()拿不到数据是正常的——这个Map仅解析application/x-www-form-urlencoded这类表单编码的参数,而你提交的是text/plain格式的原始JSON,没有关联参数名,所以不会被解析到参数Map里。要获取这份原始数据,需要直接读取HTTP请求的输入流。
实现代码
通过ExternalContext获取底层的HttpServletRequest,然后读取输入流即可:
import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.IOException; public String fetchRawJsonPayload() throws IOException { FacesContext ctx = FacesContext.getCurrentInstance(); HttpServletRequest request = (HttpServletRequest) ctx.getExternalContext().getRequest(); // 匹配请求的字符编码,避免乱码 request.setCharacterEncoding("UTF-8"); BufferedReader reader = request.getReader(); StringBuilder payload = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { payload.append(line); } return payload.toString(); }
注意点
- 字符编码要和请求保持一致,比如你的JSON用UTF-8发送,就设置
UTF-8,防止出现乱码。 - 请求输入流只能读取一次,如果应用里有过滤器或其他组件已经读取过流,需要用
HttpServletRequestWrapper包装请求,缓存流内容来支持重复读取。 - JSF 2.3+的
@RequestParameter注解仅适用于表单参数,对你的场景不适用,直接读流是最稳妥的方案。
内容的提问来源于stack exchange,提问作者Kash.
相关产品推荐
相关产品推荐

