2012-12-05 75 views
3

背景:我的應用程序是使用基於web的應用:
Spring MVC的JSON生產時間太長在某些情況下

  • 春3.1.0
    發佈
  • 傑克遜1.9.2

詳細信息:
我有一個簡單的類(讓我們稱之爲MyClass),存儲,像一個int,一個字符串和一個字節[]。 我做一個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層通過我的服務層)填充有存儲在數據庫中的二進制內容(想象的小文本文件的內容) ,它工作正常.IOW,myObj構造的很好。 問題是,在瀏覽器中獲取結果需要很長時間。 例如:500 KB - 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中(MyClass類型的)忽略的byte [] 一切正常:快速answer.Check下面的序列化。

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()); 

總結:我所尋找的是一個快(快)響應getMyObj電話,考慮到MyObj中存儲字節數組。

任何意見/建議?

謝謝。

回答

1

如果你不受限於Jackson1,我建議:

  1. Jackson 2
  2. Jackson Afterburner Module

傑克遜也有序列化功能,您可以切換:具體而言,FLUSH_AFTER_WRITE_VALUE可能的幫助。

+0

如何在Spring XML上下文文件中切換這些功能? – anton1980

+0

@ anton1980:我認爲在依賴管理級別上做得更好。例如,如果您使用的是Maven,則會聲明依賴關係。 –