背景:我的應用程序是使用基於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中存儲字節數組。
任何意見/建議?
謝謝。
如何在Spring XML上下文文件中切換這些功能? – anton1980
@ anton1980:我認爲在依賴管理級別上做得更好。例如,如果您使用的是Maven,則會聲明依賴關係。 –