NAKAMURA Minoru の日記 (2019年5月)

先月の日記(2019年04月) 今月の日記(2019年05月) 来月の日記(2019年06月)
2002 | 10 | 11 | 12
2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2012 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2013 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2014 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2015 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2016 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2017 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2018 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2019 | 1 | 2 | 3 | 4 | 5
ホームページ | 最新のコメント50
インデックス: 食べ歩き | Java | プログラム | UNIX | 画像
最新の日記へのリンク | この日記ページをはてなアンテナに追加 この日記ページをはてなブックマークに追加
はてな ダイアリー アンテナ ブックマーク ブログ
Twitter | mixi | Facebook | Google+
slideshare | github | Qiita



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 型に戻したものをレスポンスとして返す以外の方法が見つからない。


5/5 (日)

[Andorid]

2月16日にスマフォを買い替えてから、古いほうの SH-01F は音楽プレイヤーとして再利用していたのだが、FTP サーバーを立ち上げて SH-01F に曲を転送しようと思ってもエラーとなる現象に遭遇。 どうも Android 4.4 に上がった時から外部 SD カードにアプリケーションからの書き込みが禁止されていたのね。 Android 5 系に上げると再び SD カードへ書き込みができるようになるようだが、SH-01F はもう OS のバージョンアップは期待できない。


先月の日記(2019年04月) 今月の日記(2019年05月) 来月の日記(2019年06月)
2002 | 10 | 11 | 12
2003 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2004 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2005 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2006 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2007 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2008 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2009 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2010 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2011 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2012 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2013 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2014 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2015 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2016 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2017 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2018 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
2019 | 1 | 2 | 3 | 4 | 5
ホームページ | 最新のコメント50
インデックス: 食べ歩き | Java | プログラム | UNIX | 画像
最新の日記へのリンク | この日記ページをはてなアンテナに追加 この日記ページをはてなブックマークに追加
はてな ダイアリー アンテナ ブックマーク ブログ
Twitter | mixi | Facebook | Google+
slideshare | github | Qiita


Written by NAKAMURA Minoru, Email: nminoru atmark nminoru dot jp, Twitter:@nminoru_jp