Java SE 6 と JAXB

Download Report

Transcript Java SE 6 と JAXB

Webサービス II (第8回)
http://www.wakhok.ac.jp/~tatsuo/ws2/
2006年11月15日
植田龍男
今週の Java の2大ニュース!!

Java のオープンソース化が正式に発表!
http://www.sun.com/software/opensource/java/

Java SE 6 がβ版ではなくなりました!
JDK 6 Release Candidate
http://java.sun.com/javase/downloads/ea.jsp
本日の目標(その1)




Java SE 6 をインストールしよう
Windows版は管理者権限が必要
(自分のノートPCなどを利用してください。)
実習室のマシンの場合
Linux で作業してください。
注意: 250Mbyte ほどの空き容量が必要
インストールの手順
Linux 用のインストールプログラム
jdk-6-rc-linux-i586.bin をダウンロード
(RPMの形式もあるが、これも管理者権限が
必要になる)
 適当なディレクトリで実行
sh jdk-6-rc-linux-i586.bin
 作業したディレクトリの下に展開される
jdk1.6.0/bin を PATH の先頭に追加

設定ファイルの例

.profile
if [ `uname` = "Linux" ]; then
PATH=~/jdk1.6.0/bin:.:$PATH
export PATH
fi
JAXB を使ってみよう(1)



xjc, schemagen ツールの利用
JavaからXMLへ、XMLからJavaへの確認
ビルドファイルは不要
javac と java のみ!
JAXBを使ってみよう(2)

RESTful な Webサービスへのアクセス
これも xjc,javac と java だけでできるはず
JAX-WSの補足(前回の復習)




REST(Representational State Transfer)
HTTP で XMLのデータなどを交換するスタ
イルのWebサービス
SOAP(XML-RPC) vs. REST ??
JAX-WS は JAX-RPC の後継だが RESTに
も対応可能 – JAXB がベース
サービス固有のXML Java のクラス
javax.xml.ws パッケージ


Service クラス
Serviceのインナクラス
enum ServiceMode
ServiceMode.MESSAGE
ServiceMode.PAYLOAD
Provider, Dispatch, Response などのイン
タフェース群
JAX-WS for REST の現状
一部の仕様が流動的(?)
 バグ有り(?)
 情報も少ない
 参照)
Marc Hadley氏のブログ
http://weblogs.java.net/blog/mhadley/arc
hive/2006/03/restful_web_ser_1.html

サンプル(Yahoo Image検索)
Yahoo Image Search の API
http://developer.yahoo.com/search/image
/V1/imageSearch.html
 XML Schema も公開
http://search.yahooapis.com/ImageSearc
hService/V1/ImageSearchResponse.xsd

サンプル実行までの手順
スキーマから xjc でJavaのソースを生成
(この時、一部手を入れる必要あり?
どうなったのだろう?)
 生成されたソースのコンパイル(javac)
 クライアントのコンパイル(javac)
 実行(java)

xjc と生成されるソース


xjc ImageSearchResponse..xsd
yahoo/srchmi 以下に
ResultSet.java, ResultType.java,
ThumbnailType.java
ObjectFactory.java, package-info.java
ちょっと修正が必要だったが?

ResultSet.java
@XmlRootElement(name = “ResultSet”)
public class ResultSet {
@XmlRootElement(name = "ResultSet")
 あれ?名前空間の指定が見当たらない!
またまた仕様が変更された?
名前空間の情報は package-info.java
に記述されている
 package-info.java
@javax.xml.bind.annotation.XmlSchema(
namespace = "urn:yahoo:srchmi",
elementFormDefault =
javax.xml.bind.annotation.XmlNsForm.
QUALIFIED)
package yahoo.srchmi;

サンプルソース(1) 前回と同じ
URI nsURI = new URI("urn:yahoo:srchmi");
QName serviceName = new
QName("yahoo",nsURI.toString());
QName portName = new
QName("yahoo_port",nsURI.toString());
Service s = Service.create(serviceName);
サンプルソース(2) 前回と同じ
URI address = new URI("http", null,
"api.search.yahoo.com", 80,
"/NewsSearchService/V1/newsSearch",
"appid=jaxws_restful_sample&type=all&
results=10&sort=date&query=Japan“
,null);
s.addPort(portName, HTTPBinding.HTTP_BINDING,
address.toString());
サンプルソース(3)
JAXBContext jbc =
JAXBContext.newInstance( "yahoo.yn" );
Dispatch<Object> d
= s.createDispatch(portName, jbc,
Service.Mode.PAYLOAD);
Map<String, Object> requestContext =
d.getRequestContext();
requestContext.put(
MessageContext.HTTP_REQUEST_METHOD,
"GET");
サンプルのソース(4) 前回は
StreamSource ss =
(StreamSource)d.invoke(null);
Unmarshaller u =
jbc.createUnmarshaller();
ResultSet rs =
(ResultSet)u.unmarshal(ss);
サンプルのソース(4) 今回は
ResultSet rs = (ResultSet)d.invoke(null);
for (ResultType r: rs.getResult()) {
System.out.println(
r.getTitle() + “ “ + r.getClickUrl() );
}
 かなり簡略化された仕様に変更
ビルドファイルはいりません
xjc ImageSearchResponse.xsd
javac yahoo/srchmi/*.java
javac YahooImageTest.java
java YahooImageTest
通常のWebサービスも簡単に



ただし、サーバとの互換性が・・・
サーバの側も新しい仕様にしましょう
Linux 用の最新の GlassFish で試す?
(これは次回に)