背景: 私のアプリケーションは、以下を使用する Web ベースのアプリケーションです。
- 春の 3.1.0 リリース
- ジャクソン 1.9.2
詳細 :
int、String、byte[] などを格納する単純なクラス (MyClass と呼びましょう) があります。以下のメソッドを呼び出す 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 レイヤーを介して私のサービス レイヤーによって) で埋められます (小さなテキスト ファイルのコンテンツを想像してください)。問題は、ブラウザで結果を取得するのに非常に時間がかかることです。例: 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>
運が悪い...おそらく、byte []を無視してmyObj(MyClassタイプの)をシリアル化すると、すべて正常に機能すると言う価値があります。以下のSerializerを確認してください。
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());
要約すると、myObj がバイト配列を格納していることを考慮して、getMyObj 呼び出しに対する高速 (高速) な応答を求めています。
アイデア/提案はありますか?
ありがとうございました。