在某些情况下,Spring MVC JSON producer花费的时间太长

在某些情况下,Spring MVC JSON producer花费的时间太长,json,spring,spring-mvc,jackson,Json,Spring,Spring Mvc,Jackson,背景:我的应用程序是一个基于web的应用程序,使用: Spring 3.1.0版本 杰克逊1.9.2 详细信息: 我有一个简单的类(我们称之为MyClass),它存储一个int、一个字符串和一个byte[]。 我执行HTTP调用,调用以下方法: @RequestMapping(value = "/getMyObj", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON, produces = MediaTyp

背景:我的应用程序是一个基于web的应用程序,使用:

  • Spring 3.1.0版本
  • 杰克逊1.9.2
详细信息:
我有一个简单的类(我们称之为MyClass),它存储一个int、一个字符串和一个byte[]。 我执行HTTP调用,调用以下方法:

 @RequestMapping(value = "/getMyObj", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON) 
    @ResponseBody
    public MyClass getMyObj(@RequestBody String id {
        try{
                     MyClass myObj=myService.getMyClassObject(id);
             return myObj;
        } catch (Exception e){
            return ErrorResult(APIError.ERROR,e.getMessage());
        }
    }
字节数组(由我的服务层通过我的dao层)由存储在数据库中的二进制内容(想象一个小的文本文件内容)填充,工作正常。 问题是在浏览器中获得结果需要很长时间。 示例:500KB-16分钟

如果我直接流式传输文件(下面的代码),速度非常快(比如1秒)。 当然,我希望第一种方法会更慢……但不是在这个差异上

@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
@ResponseBody
public void getFile(@PathVariable("id") String id, HttpServletResponse response) {
    try {
        response.reset();
        myService.get(id, new MyHttpConsumer (response));
    } catch (Exception e) {
        s.printStackTrace();
    }
}


private class MyHttpConsumer implements MyConsumer {
        private HttpServletResponse response;
        public MyHttpConsumer (HttpServletResponse response) {
            this.response = response;
        }

        public void setContentType(String contentType) {
            response.setContentType(contentType);
        }

        public OutputStream getOutputStream() throws IOException {
            return response.getOutputStream();
        }
    }
我已经尝试使用自定义ObjectMapper以某种方式改进序列化

   <bean id="myObjectMapper" class="com.*.*.MyObjectMapper"/>      
    <mvc:annotation-driven validator="validator">
        <mvc:message-converters register-defaults="true">
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                    <property name="objectMapper" ref="myObjectMapper" />
                </bean>
    </mvc:message-converters>   
    </mvc:annotation-driven>
总而言之:考虑到myObj存储字节数组,我想要的是对getMyObj调用的快速(更快)响应

有什么想法/建议吗


谢谢。

如果您不局限于Jackson1,我建议您:


  • Jackson还提供了可以切换的序列化功能:具体来说,可能会有所帮助。

    在Spring XML上下文文件中如何切换这些功能?@anton1980:我认为最好在依赖项管理级别进行切换。例如,如果您使用的是Maven,那么您将声明依赖项。
       class MySerializer extends JsonSerializer<MyClass>
        {
            @Override
            public void serialize(MyClass value, JsonGenerator jgen,
                    SerializerProvider provider) throws IOException,
                    JsonProcessingException {
                // TODO Auto-generated method stub
                jgen.writeStartObject();
                byte[] b= values.getContent();
                jgen.writeBinaryField("content", b);
                    //jgen.writeFieldName("id");
                //jgen.writeNumber(value.getId());
                jgen.writeEndObject();
    
            }
        }
    
    module.addSerializer(MyClass.class, new MySerializer());