5/31 (金)
[Movie] ゴジラ キング・オブ・モンスターズ
109 シネマズ川崎で『ゴジラ キング・オブ・モンスターズ』(原題: Godzilla: King of the Monsters)の2D字幕版を観る。
- 今回は怪獣対策が進んだのか住民の避難が徹底していて、人的被害は小さい。人類も学習するようだ。
- 『キングコング: 髑髏島の巨神』で出てきたモナークという組織がクローズアップされる。次回作はいよいよコング v.s. ゴジラか。
- チャン・ツィイーが双子の博士を演じていることはもう少しはっきりさせておいて欲しいよ。
- 渡辺 謙はいい役貰った。
5/12 (日)
5/10 (金)
[Linux] Red Hat Enterprise Linux 8
Red Hat Enterprise Linux の 8 が登場。 RHEL 7 はソフトウェアスタックが古くなっていたが、これでアップデートされる。 RHEL 6 → 7 は systemd 化や NetworkManager 化などいろいろあって差が顕著だったが、7 → 8 はあまり目新しい感じがしない。
- Red Hat | Red Hat Enterprise Linux 8 (公式)
- Togetter | RHEL8まめちしき
- Publickey | 自由に再配布可能なRed Hat Enterprise Linux 8ベースのコンテナ用OSイメージ「Red Hat Universal Base Image」が公開
5/6 (月)
[Java] JAX-RS(Jersey) で XML 形式でレスポンスを返す場合に Content-Type が text/xml にできない
JAX-RS は JAXB を使って、HTTP のリクエストボディに含まれる XML 形式や JSON 形式のデータを自動的に Java の POJO クラスにバインディングする機能が存在する。 逆に POJO クラスを XML や JSON に変換して出力することもできる。
例えば User
という Java クラスがあったとする。
public class User {
public String name;
public int age;
}
JAX-RS は User
を使うと以下のように書ける。
import javax.ws.rs.Consumes; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; @POST @Consumes({"application/json", "application/xml"}) @Produces("application/json") @Path("/") public User getUser(User request) { request = request + 1; return request; }
この REST API は JSON と XML の両方を受理することができる。 JAX-RS は HTTP のリクエストの Content-Type ヘッダーを使ってこれを判定しており、@Consumes アノテーションはどの Content-Type を受け入れるかを支持している。 逆にレスポンスは @Produces アノテーションで指定しており、JSON になる。
curl -X POST -H "Conent-Type: application/json" http://host.example.com:port/path/ -d '{"name":"nminoru", "age":21}' curl -X POST -H "Conent-Type: application/xml" http://host.example.com:port/path/ -d '<User><name>nminoru</name><age>21</age></User>'
しかしこれだと入力が複数形式を採れるのに、レスポンスは1形式に縛れてしまう。
そこでメソッドの戻り値を javax.ws.rs.core.Response
とする。
HTTP ステータスコード、レスポンスボディのヘッダー等を細かく調整できるようになる。
import javax.ws.rs.core.Response; @POST @Consumes({"application/json", "application/xml"}) @Path("/") public Response getUser(User request) { request = request + 1; return Response.status(200).type("application/xml").entity(request).build(); }
ところが問題がある。 XML 形式のリクエストを受け付けるには application/xml か text/xml を指定することができるのだが、レスポンスには appliaction/xml しか受け付けない。 text/xml を指定するとエラーが発生する。 JAX-RS(Jersey)の内部でエラーが発生して、レスポンスは自動的に 500 (Internal Server Error) となる。
import javax.ws.rs.core.Response;
@POST
@Consumes({"application/xml", "text/xml"})
@Path("/")
public Response getUser(User request) {
request = request + 1;
return Response.status(200).type("text/xml".)entity(request).build();
}
JAXB 側の問題のようなのだが、POJO クラスを渡さずに JAXB でマーシャリングして String 型に戻したものをレスポンスとして返す以外の方法が見つからない。