Web services 写入响应期间的MappableException

Web services 写入响应期间的MappableException,web-services,tomcat,jersey,jackson,tomcat8,Web Services,Tomcat,Jersey,Jackson,Tomcat8,我正在使用Jersey编写一个Web服务,但在客户端的响应请求过程中遇到了一个异常 我在下面遇到了异常:(我在异常后解释并附加了代码) 我正在编写一个响应(javax.ws.rs.core.Response)并在实体响应参数上列出一个列表,这个列表有对象,数组很大,因此,我尝试使用“StreamingOutput”来减小其大小,但没有成功,请按照我的代码操作: 综合反应 @GET @Path("/request/getSales") public Response getSale

我正在使用Jersey编写一个Web服务,但在客户端的响应请求过程中遇到了一个异常

我在下面遇到了异常:(我在异常后解释并附加了代码)

我正在编写一个响应(javax.ws.rs.core.Response)并在实体响应参数上列出一个列表,这个列表有对象,数组很大,因此,我尝试使用“StreamingOutput”来减小其大小,但没有成功,请按照我的代码操作:

综合反应

@GET
    @Path("/request/getSales")
    public Response getSales(@QueryParam(value = "loginKey") String loginKey, 
            @QueryParam(value = "saleID") String saleID, @QueryParam(value = "date") String date) {
        Response response = null;

        try {
            // if profile has logged on server, it's necessary to get his state.
            LoggedProfile loggedProfile = ServerGlobal.getInstance().getLoggedProfile(loginKey);
            if(loggedProfile != null) {
                List<Sale> sales = null;
                if("".equals(saleID) && "".equals(date)) {
                    log.debug("saleID && date is empty.");
                    // No sale are saved, it's necessary to check if server saved some sale for current Profile                 
                    sales = SaleDao.getInstance().getAllSalesByProfileID(loggedProfile.getProfileID());
                } else if(!"".equals(date)) {
                    log.debug("date is not empty.");
                    // Search sale for one period
                    sales = SaleDao.getInstance().getSalesByPeriod(
                            new Timestamp(Long.valueOf(date)), 
                            !("".equals(saleID)) ? Integer.parseInt(saleID) : null);
                }

                // Big data compress, low memory and high performance to process json.
                StreamingOutput stream = Parser.parserSalesToStreaming(sales);

                response = **Response.ok().status(ResponseStatus.RESPONSE_GET_SALES_OK).entity(stream).build();**
@GET
@路径(“/request/getSales”)
公共响应getSales(@QueryParam(value=“loginKey”)字符串loginKey,
@QueryParam(value=“saleID”)字符串saleID,@QueryParam(value=“date”)字符串日期{
响应=空;
试一试{
//若配置文件已登录到服务器,则必须获取其状态。
LoggedProfile LoggedProfile=ServerGlobal.getInstance().getLoggedProfile(loginKey);
if(loggedProfile!=null){
列表销售=空;
如果(“.equals(saleID)&&”equals(date)){
debug(“saleID&&date为空”);
//未保存销售,需要检查服务器是否为当前配置文件保存了一些销售
sales=SaleDao.getInstance().getAllSalesByProfileID(loggedProfile.getProfileID());
}如果(!“”.等于(日期))则为else{
调试(“日期不为空”);
//搜索销售一段时间
sales=SaleDao.getInstance().getSalesByPeriod(
新时间戳(Long.valueOf(date)),
!(“”.equals(saleID))?Integer.parseInt(saleID):null;
}
//大数据压缩,低内存,高性能处理json。
StreamingOutput stream=Parser.parserSalesToStreaming(销售);
response=**response.ok().status(ResponseStatus.response\u GET\u SALES\u ok).entity(stream.build()**
我的流量输出

public static StreamingOutput parserSalesToStreaming(List<Sale> sales) {

        StreamingOutput stream = new StreamingOutput() {

            @Override
            public void write(OutputStream arg0) throws IOException, WebApplicationException {
                JsonFactory jsonFactory = new JsonFactory();
                JsonGenerator generator = jsonFactory.createGenerator(arg0, JsonEncoding.UTF8);
                ObjectMapper mapper = new ObjectMapper();
                generator.writeStartArray();

                for(Sale sale : sales) {
                    generator.writeObject(mapper.writeValueAsString(sale));
                }

                generator.writeEndArray();
                generator.close();
            }
        };

        return stream;
    }
publicstaticstreamingoutput parserSalesToStreaming(列表销售){
StreamingOutput stream=新的StreamingOutput(){
@凌驾
公共无效写入(OutputStream arg0)引发IOException、WebApplicationException{
JsonFactory JsonFactory=新的JsonFactory();
JsonGenerator generator=jsonFactory.createGenerator(arg0,JsonEncoding.UTF8);
ObjectMapper mapper=新的ObjectMapper();
generator.WriteStarray();
销售(销售:销售){
generator.writeObject(mapper.writeValueAsString(sale));
}
生成器。writeEndArray();
生成器。关闭();
}
};
回流;
}
我开始在Jersey工作,所以我怀疑根本原因是“实体””上的大小,因为这只是一个大列表和这个案例。有人能帮我吗

我正在使用Tomcat,Jersey版本2.23.1


提前感谢

ClientAbortException
发生在客户端不干净地断开连接的情况下。如果客户端和服务器不同意关闭连接,您将得到这种异常。我怀疑这不是请求/响应大小的问题,而是客户端和服务器之间关于如何关闭连接的不正确协议uch数据将被传输。嗨,@ChristopherSchultz我解决了这个重构Json,我找到了根本原因,这是我发送的na图像,我使用Jackson将对象转换为Json。谢谢你的回答。
ClientAbortException
发生在客户端不干净地断开连接的情况下。如果客户端和服务器不同意应该关闭连接,您会遇到这种异常。我怀疑这不是请求/响应大小的问题,而是客户端和服务器之间关于传输多少数据的协议不正确。您好,@ChristopherSchultz我解决了这个重构Json,我找到了根本原因,我发送的是na图像,我使用Jackson将对象转换为Json.T谢谢你的回答。
public static StreamingOutput parserSalesToStreaming(List<Sale> sales) {

        StreamingOutput stream = new StreamingOutput() {

            @Override
            public void write(OutputStream arg0) throws IOException, WebApplicationException {
                JsonFactory jsonFactory = new JsonFactory();
                JsonGenerator generator = jsonFactory.createGenerator(arg0, JsonEncoding.UTF8);
                ObjectMapper mapper = new ObjectMapper();
                generator.writeStartArray();

                for(Sale sale : sales) {
                    generator.writeObject(mapper.writeValueAsString(sale));
                }

                generator.writeEndArray();
                generator.close();
            }
        };

        return stream;
    }