Jersey MVCのレスポンスのContent-Typeが「*/*」になる問題対策
詳細は後ほど追記します。
ContianerResponseFilterだと何故かできなかった・・・。
Jersey MVCは、MessageBodyWriterの中でContent-Typeを上書きしています。
ContianerResponseFilterはMessageBodyWriterよりも前に実行されるので、そりゃあ効かないですね・・・。
なので、必ずWriterInterceptorの「後処理」として書く必要があります。
MessageBodyWriterでなぜ「*/*」に上書きされるのかは、現在ソースを読んで調査中です。
package com.example.rest.interceptor; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.Provider; import javax.ws.rs.ext.WriterInterceptor; import javax.ws.rs.ext.WriterInterceptorContext; import java.io.IOException; @Provider public class ContentTypeWriterInterceptor implements WriterInterceptor { @Override public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { // デバッグログ System.out.println("======== BEFORE : " + context.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); // レスポンスへの書き込み実行(必須) context.proceed(); // デバッグログ System.out.println("======== AFTER : " + context.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE)); // レスポンスヘッダーに "Content-Type: text/html"を上書きする MultivaluedMap<String, Object> headers = context.getHeaders(); headers.putSingle(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML); } }