jfinal报 java.io.IOException:SRVE0216E:post body contains less bytes than specified by content-length


在linux用websphere部署jfinal。项目时。

在controller里。接收流和返回流数据的时候。(因为是和其他系统对接的。必须用流)

报了以下错误:很奇怪。都不知道是哪出的错。可以的话帮忙看下。

报 java.io.IOException:SRVE0216E:post body contains less bytes than specified by content-length

但是他有没报具体位置。很难找。

以下是省略的代码:

public void index() {

        renderNull();

        log.debug("报文处理模块----");

        try{

            //获取EAI_HOME  path参数

            DataInputStream dis = null;

            byte[] reqData=null;

            try

            {

                log.debug("inputStream准备读取报文体!");

                dis=new DataInputStream(new BufferedInputStream(getRequest().getInputStream()));

                int length=dis.readInt();

                log.debug("inputStream准备读取长度="+length);

                reqData=HttpConnUtil.readLenContent(dis, length);

                log.debug("inputStream读取1:"+reqData.length);

                log.debug("inputStream读取1:"+new String(reqData));

            }catch (Exception e){

                log.error("读取inputStream流失败!"+e.getMessage());

            }

            HttpServletRequest  req =  getRequest();

            HttpServletResponse  rsp =  getResponse();

            this.writeContent(rsp, rspData, "F");

        }catch (Exception e){

           log.error("报文处理异常:"+e.getMessage());

        }

}


private void writeContent(HttpServletResponse response, byte[] data, String status) {

        DataOutputStream out = null;

        try {

            log.debug("writeContent---start");

            if(status != null) {

                response.setHeader("state", status);

            }

            if(data != null) {

                out = new DataOutputStream(response.getOutputStream());

                out.writeInt(data.length);

                out.write(data);

                out.flush();

            }

            log.debug("writeContent---end");

        } catch (IOException var14) {

            log.error("写入响应数据出错", var14);

        } finally {

            try {

                if(out != null) {

                    out.close();

                    log.debug("writeContent---close-end");

                }

            } catch (IOException var13) {

                log.error("writeContent---close-Exception!"+var13.getMessage());

            }

        }

    }


评论区

lyh061619

2018-04-12 20:54

用上websphere?解决方案:
1、试着在请http请求头中加入httpURLConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
2、看是否使用的websphere本身版本问题如果是,该打补丁的就得打下补丁。

JFinal

2018-04-12 21:04

异常信息其实已经说得很清楚了:
post body contains less bytes than specified by content-length

从 DataInputStream 使用 readInt,以及你在 HttpConnUtil.readLenContent(dis, length) 中读出其它类型的数据时,数据都要指定一个长度,例如 int 是四个字节,但你的 DataInputStream 里头的数据在某次读取的时候数据根本不够长

简单说就是传过来的数据格式无法满足预期,多了解下 DataInputStream 的用法即可

lzq1990

2018-04-13 10:08

@lyh061619 websphere是别人管理的。我本机测试只有tomcat。而且别人的环境我没办法操控。所以我想从代码上去解决。网上也是有提到过版本的问题。打补丁。但是我本身没有环境测试。不过还是很感谢你的建议。

lzq1990

2018-04-13 10:15

@JFinal 谢谢波总的提示。这个地方原本是用servlet,原本也没有报错。后来我把系统分离了一部分业务量重的出来,用jfinal快速搭建子系统。就有这部分。想用jfinal代替servlet的。然后这部分就报错了。他也没提示是哪一块报的错。跟踪log,却是在完成rendernull()之后报的错。我先看下DataInputStream先。看看是否是这里的问题。

lzq1990

2018-04-13 17:52

@JFinal 我重新跟踪了代码。结果发现从流里面读取数据。也就是DataInputStream is; 通过另外接收的byte长度,int len =dis.readInt();---int rsLen =is.read(byte[] retDate,0,len);中,读取的rslen==len;也就是说并没有出现数据某次读取不够长的情况。

lzq1990

2018-04-13 17:55

@JFinal 有没有可能。虽然我用renderNull();但是他会重新跳转进入本次请求。然后第二次请求已经是没有流数据的了。所以这个时候就流读取报错。

JFinal

2018-04-13 20:37

@lzq1990 只要是调用了 renderNull() , jfinal 就不再干预流了,用户完全自己掌控流

lzq1990

2018-04-16 16:43

@JFinal 也就是说在controller里面第一行调用了renderNull();其实就相当于纯servlet。输入输出的都是自己定义的是吧?

热门反馈

扫码入社