3

背景: 私のアプリケーションは、以下を使用する 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 呼び出しに対する高速 (高速) な応答を求めています。

アイデア/提案はありますか?

ありがとうございました。

4

1 に答える 1