1. ホーム
  2. java

[解決済み] Spring MVCでレスポンスのcontent-typeを設定する人(@ResponseBody)

2022-06-11 15:57:08

質問

私はアノテーション駆動のSpring MVCのJava Webアプリケーションでjetty Webサーバー(現在maven jettyプラグイン)で実行されている持っています。

私は、1つのコントローラメソッドが文字列のヘルプテキストだけを返す、いくつかのAJAXサポートを行おうとしています。リソースはUTF-8エンコーディングで、文字列もそうですが、サーバーからの私の応答は次のようになります。

content-encoding: text/plain;charset=ISO-8859-1 

を送信しても、ブラウザが

Accept-Charset  windows-1250,utf-8;q=0.7,*;q=0.7

なぜかspringのデフォルト設定を使っています

このBeanを設定に追加するヒントを見つけたのですが、エンコーディングをサポートしていないと書いてあり、代わりにデフォルトのものが使われているので、使われていないだけなのだと思います。

<bean class="org.springframework.http.converter.StringHttpMessageConverter">
    <property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
</bean>

私のコントローラのコードは次のとおりです (このレスポンスタイプの変更は私には機能しないことに注意してください)。

@RequestMapping(value = "ajax/gethelp")
public @ResponseBody String handleGetHelp(Locale loc, String code, HttpServletResponse response) {
    log.debug("Getting help for code: " + code);
    response.setContentType("text/plain;charset=UTF-8");
    String help = messageSource.getMessage(code, null, loc);
    log.debug("Help is: " + help);
    return help;
}

どのように解決するのですか?

シンプルな宣言で StringHttpMessageConverter ビーンに注入するだけでは十分ではありません。 AnnotationMethodHandlerAdapter :

<bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
        <array>
            <bean class = "org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
            </bean>
        </array>
    </property>
</bean>

しかし,この方法では,すべての HttpMessageConverter を再定義する必要があり、また <mvc:annotation-driven /> .

そこで、おそらく最も便利でありながら醜い方法は AnnotationMethodHandlerAdapterBeanPostProcessor :

public class EncodingPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String name)
            throws BeansException {
        if (bean instanceof AnnotationMethodHandlerAdapter) {
            HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
            for (HttpMessageConverter<?> conv: convs) {
                if (conv instanceof StringHttpMessageConverter) {
                    ((StringHttpMessageConverter) conv).setSupportedMediaTypes(
                        Arrays.asList(new MediaType("text", "html", 
                            Charset.forName("UTF-8"))));
                }
            }
        }
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String name)
            throws BeansException {
        return bean;
    }
}

-

<bean class = "EncodingPostProcessor " />