かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

JAX-RSのMessageBodyWriterを使って出力をカスタマイズ

JAX-RSって出力を柔軟に差し替えれるんですね。知りませんでした。これは捗る。やりかたは簡単。MessageBodyWriterインターフェースを実装して@Providerアノテーションをつけるだけ。

package okazuki.mavenproject7;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

@Provider
public class SampleMessageBodyWriter implements MessageBodyWriter<String> {

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        // StringならOK
        return String.class.isAssignableFrom(type);
    }

    @Override
    public long getSize(String t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        // サイズは気にしない
        return -1;
    }

    @Override
    public void writeTo(
            String t,
            Class<?> type,
            Type genericType,
            Annotation[] annotations,
            MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders,
            OutputStream entityStream) throws IOException, WebApplicationException {
        // 文字列をh1タグで出力
        PrintWriter pw = new PrintWriter(entityStream);
        pw.println("<html><body>");
        pw.printf("<h1>%s</h1>", t);
        pw.println("</body></html>");
        pw.flush();
    }
}

これは、文字列をh1タグで囲って出力するだけのものです。JAX-RSのサービスのクラスはこんな感じ。

package okazuki.mavenproject7;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("sample")
public class SampleResource {
    @GET
    @Produces("text/html")
    public String get() {
        return "こんにちは世界";
    }
}

ビルドして実行してhttp://localhost:8080/アプリ名/webresources/sampleにアクセスすると以下のようなHTMLが返ってきます。

<html><body>
<h1>こんにちは世界</h1></body></html>

こいつはいい!