matsukaz's blog

Agile, node.js, ruby, AWS, cocos2d-xなどなどいろいろやってます

Java SE 6に含まれるJAX-WS/JAXBのバージョン整理

久々にJAX-WSをいじっていたら、wsimportで生成したソースが以前と違ってていきなりコンパイルエラーに。調べてみたらJava SE 6 Update 14からJAX-WSのバージョンが変更されてたみたい。下位互換保ててないじゃん。。。忘れそうなのでちょっと状況を整理。

Java SE 6のリリースノートによると、Java SE 6に含まれるJAX-WSのバージョンは以下の通りみたい。

Java SE 6のバージョン JAX-WSのバージョン
Update 3 以前 JAX-WS 2.0
Update 4 以降 JAX-WS RI 2.1.1 in JDK 6
Update 14 以降 JAX-WS RI 2.1.6 in JDK 6

JAX-WSのバージョンの違いは、JAX-WSの更新履歴で公開されてます。

ちなみに自分が引っかかったのは、wsimportで生成されたソースで、Listに対するsetterがなくなってるという・・・と、ここまで書いて気づいたけど、これってJAXBのバインディングコンパイラ(XJC)問題だ。。。orz
JAXBに関してもバージョンを調べてみたら以下の通りでした。

Java SE 6のバージョン JAXBのバージョン
Update 3 以前 JAXB 2.0
Update 4 以降 JAXB RI 2.1.3 in JDK 6
Update 14 以降 JAXB RI 2.1.10 in JDK 6

JAXBのバージョンの違いは、Java Architecture for XML Binding 2.0 Changelog辺りで。
JAXBのチュートリアル2.2.7 Defining a List of Integersを見る限りだと

The code in the getter method ensures that the List is created. There is no corresponding setter which means that all additions or deletions of list elements have to be made on the "live" list. 

となっているので、setterがあること自体がおかしかったっぽい。どのBugfixで修正されたのか確認できなかったけど。
JAXB 2.1 Collection setter Injector Pluginを使えばsetterを埋め込むこともできるけど、そこまでする必要はなさそうなので、今回はgetterでListをとってaddAll()で回避ということで。