<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Extreme Pattern: Hello JAXB2 and JavaSE6</title>
    <link>http://blog.extremepattern.com/articles/2006/12/11/hello-jaxb2-and-javase6</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>enjoy</description>
    <item>
      <title>Hello JAXB2 and JavaSE6</title>
      <description>&lt;h3&gt;源起&lt;/h3&gt;


	&lt;p&gt;幾個專案用過 XMLBeans，還不錯用，之前評估過 &lt;span class="caps"&gt;JAXB 1&lt;/span&gt;.0 版本，有兩個問題，
一是 &lt;span class="caps"&gt;XML&lt;/span&gt; Schema 支援有點問題，一是 &lt;span class="caps"&gt;JAXB&lt;/span&gt; 當時有商業授權等議題。&lt;/p&gt;


	&lt;p&gt;這些專案是採 &lt;span class="caps"&gt;XML&lt;/span&gt; Schema 為主的做法，也就是需要先由客戶端決定商業領域的語法，
交付寫好的 schema，那時 &lt;span class="caps"&gt;JAXB 1&lt;/span&gt; 沒辦法很方便的foo.xsd 轉 foo.java，
而 foo.xsd 一直改到後期會越來越複雜，一堆的 complex type，所以那時找到能
符合專案 schema 與授權的方案是 &lt;span class="caps"&gt;BEA&lt;/span&gt; 釋出的 Apache XMLBeans。&lt;/p&gt;


	&lt;p&gt;不過時過境遷，現在 &lt;span class="caps"&gt;JAXB 2&lt;/span&gt; 授權也改了，支援 &lt;span class="caps"&gt;XML&lt;/span&gt; schema 應該也
比較好，同時 JavaSE6 已經內建支援，於是來玩看看。&lt;/p&gt;


	&lt;p&gt;http://download.java.net/jdk6/docs/technotes/guides/xml/jaxb/index.html&lt;/p&gt;


	&lt;h3&gt;scheam-first or code-first&lt;/h3&gt;


	&lt;p&gt;如果先寫 schema 的話，需要使用 xjc，就 eclipse 來說，使用 ant 比較方便。
不過 com.sun.tools.xjc.XJCTask 並不存在 &lt;span class="caps"&gt;JRE&lt;/span&gt; 中，需要下載 jaxb-xjc.jar 來用。&lt;/p&gt;


	&lt;p&gt;https://jaxb.dev.java.net/nonav/2.0.2/docs/xjcTask.html&lt;/p&gt;


	&lt;p&gt;https://jaxb.dev.java.net/&lt;/p&gt;


	&lt;p&gt;用 xjc 產生 java 碼後，就可以開始用。&lt;/p&gt;


&lt;pre&gt;
ProjectType pj = new ProjectType();
...[SKIP]
ObjectFactory objFactory = new ObjectFactory();
JAXBElement&amp;lt;ProjectType&amp;gt; je = objFactory.createProject(pj);

JAXBContext jc = JAXBContext.newInstance(ProjectType.class);
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
&lt;/pre&gt;

	&lt;p&gt;簡單 marshaller.marshal(jaxbElement, System.out) 的結果。&lt;/p&gt;


&lt;pre&gt;
&amp;lt;ns2:project xmlns:ns2="http://config.service.haha/ns/project"&amp;gt;
    &amp;lt;profile&amp;gt;
        &amp;lt;name&amp;gt;FOO PROJECT&amp;lt;/name&amp;gt;
    &amp;lt;/profile&amp;gt;
&amp;lt;/ns2:project&amp;gt;
&lt;/pre&gt;

	&lt;h3&gt;更換 ns2&lt;/h3&gt;


	&lt;p&gt;指定預設或是更動命名空間的 prefix 並不在 &lt;span class="caps"&gt;JAXB2&lt;/span&gt; 的規格 (JSR-222 spec) 中，
所以 &lt;span class="caps"&gt;JAVA6&lt;/span&gt; 平台無法提供這類的 marshaller 機制，要用 &lt;span class="caps"&gt;JAXB2 RI&lt;/span&gt; 才可以，
因為有的 schema 的 prefix 名稱是定死的，不支援這個會比較麻煩。&lt;/p&gt;


&lt;pre&gt;
//  RI 才有支援，需要 jaxb-impl.jar，JAVA6  不包含
marshller.setProperty("com.sun.xml.bind.namespacePrefixMapper",
  new NamespacePrefixMapper() {
    @Override
    public String getPreferredPrefix(String nsuri,
               String suggestion, boolean requirePrefix) {
        // 無法調成 default 只能改掉。用 "" 無效 ?
        if ("http://config.service.haha/ns/project".equals(nsuri))
            return "pj";
        return suggestion;
      }
    });
&lt;/pre&gt;

	&lt;p&gt;結果輸出&lt;/p&gt;


&lt;pre&gt;
&amp;lt;pj:project xmlns:pj="http://config.service.haha/ns/project"&amp;gt;
    &amp;lt;profile&amp;gt;
        &amp;lt;name&amp;gt;FOO PROJECT&amp;lt;/name&amp;gt;
    &amp;lt;/profile&amp;gt;
&amp;lt;/pj:project&amp;gt;
&lt;/pre&gt;

	&lt;h3&gt;取部份 &lt;span class="caps"&gt;XML&lt;/span&gt; 輸出&lt;/h3&gt;


	&lt;p&gt;之前用 XMLBeans 都用複製 copy 模式建立另一個文件來修改取出需要的部份，
&lt;span class="caps"&gt;JAXB&lt;/span&gt; 似乎沒有這類方式，需要建立兩個物件複製。&lt;/p&gt;


	&lt;h3&gt;haha.remix.jaxb&lt;/h3&gt;


	&lt;p&gt;基本上就是轉包 jaxb-api.jar, jaxb-impl.jar, jsr173_1.0_api.jar 供 OSGi 平台使用，
&lt;span class="caps"&gt;JAVA6&lt;/span&gt; 雖然有支援 &lt;span class="caps"&gt;JAXB2&lt;/span&gt;，但是需要 com.sun.xml.bind.namespacePrefixMapper 的情況下，
還是要使用附加的 jaxb-impl.jar。&lt;/p&gt;


	&lt;p&gt;另外使用 haha.remix.jaxb 讓 &lt;span class="caps"&gt;JAVA5&lt;/span&gt; 也一樣可以用。&lt;/p&gt;


	&lt;h3&gt;&lt;span class="caps"&gt;JAVA6&lt;/span&gt;&lt;/h3&gt;


	&lt;p&gt;根據 &lt;a href="http://blogs.sun.com/dagastine/entry/java_6_leads_out_of"&gt;Java 6 Leads Out of the Box Server Performance&lt;/a&gt; 
的說法，這個快上很多的出場預設性能蠻吸引人的。&lt;/p&gt;


	&lt;h3&gt;觀察&lt;/h3&gt;


	&lt;ol&gt;
	&lt;li&gt;因為 &lt;span class="caps"&gt;JAXB&lt;/span&gt; 已經是個標準，關於 &lt;span class="caps"&gt;JAXB&lt;/span&gt; 的用法還要再深入觀察。&lt;/li&gt;
		&lt;li&gt;個人目前用起來  XMLBeans 比較直覺，也有可能是用習慣的關係。&lt;/li&gt;
		&lt;li&gt;簡單的綁定， &lt;span class="caps"&gt;JAVA 6&lt;/span&gt; 是個不錯的現成平台，如果要更細部的支援，無可避免還是要加 jar 到平台上，這時 &lt;span class="caps"&gt;JAXB2 RI&lt;/span&gt; 或是 XMLBeans 就看哪個用的順手，功能也都可以提供為主。&lt;/li&gt;
	&lt;/ol&gt;</description>
      <pubDate>Mon, 11 Dec 2006 22:14:00 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:0e8b5534-c24a-4457-a2a1-e932450e9877</guid>
      <author>LIN</author>
      <link>http://blog.extremepattern.com/articles/2006/12/11/hello-jaxb2-and-javase6</link>
      <category>java</category>
    </item>
  </channel>
</rss>

