かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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>

こいつはいい!