問題発覚!
前回のCayenneTapestryに引き続き、今回も事前検証不足による問題が発覚しました(笑)。
AMFでやりとりするオブジェクトは、Cayenneが生成したDataObjectをそのまま使おう・・なんて軽く考えていたのが間違いでした。厳密にはJavaBeansを使う必要があるんですが、
DataObjectもJavaBeansみたいなもんだからラクショーでしょ?と思い、いろいろやってみましたが、原因不明の問題が発生・・
具体的にいえば、setterは効くがgetterが効かないとか・・これはあまり深追いすると良くないと思いまして、AMFを通るJavaBeansを新たに作る事にしました。
具体的には、新たにMessageBeanという(紛らわしい名前か!)JavaBeansをつくります。
MessageBeanはデータの転送用なので、ほとんどMessageオブジェクトと変わらないつくりになっています。
package bbs.data; import java.io.Serializable; /** * AFMでやり取りするJavaBeans * * @author tanabe * @version $Revision$ */ public class MessageBean implements Serializable { private int pk; private String titleText; private String submitDateText; private boolean child; private String content; private String mail; private String url; private String subject; private String userName; private String userPass; public MessageBean() { super(); } //以下getterとsetterなので省略
うぇ〜。二度手間。
次にMessageオブジェクトからMessageBeanを発生させるメソッドを実装します。
Message.java(抜粋)
public MessageBean getMessageBean() { MessageBean bean = new MessageBean(); bean.setPk(this.getPk()); bean.setTitleText(this.getTitleText()); bean.setSubmitDateText(this.getSubmitDateText()); bean.setContent(this.getContent()); bean.setMail(this.getMail()); bean.setUrl(this.getUrl()); bean.setSubject(this.getSubject()); bean.setUserName(this.getUserName()); bean.setUserPass(this.getUserPass()); bean.setChild(this.isChild()); return bean; }
その逆も然りで、MessageBeanを受け取って、Messageオブジェクト自身に値をセットするメソッドも実装します。
Message.java(抜粋)
public void setDataFromBean(MessageBean bean) { Date now = new Date(); this.setModificationDate(now); this.setSubmitDate(now); this.setContent(bean.getContent()); this.setMail(bean.getMail()); this.setSubject(bean.getSubject()); this.setUrl(bean.getUrl()); this.setUserName(bean.getUserName()); this.setUserPass(bean.getUserPass()); }
MessageServiceがやり取りするデータをMessageBeanにします。
MessageService.java
package bbs.service; import java.util.*; import bbs.data.MessageBean; /** * 掲示板サービスクラス * * @author toolkit * @version $Revision$ */ public class MessageService { public MessageService() { super(); } /** * 投稿された全てのメッセージの概要リストをXMLにしたものを取得します。 */ public String getSummaryListXML() throws Exception { return null; } /** * PrimaryKeyにより該当するメッセージオブジェクトを返します。 */ public MessageBean getMessageByPk(int pk) { return null; } /** * 新規メッセージを投稿します */ public MessageBean insertNewMessage(MessageBean tempMessage) { return null; } /** * parentMessageに返信するメッセージを投稿します。 */ public MessageBean insertResMessage(int parentPk, MessageBean res) { return null; } /** * PrimaryKeyにより該当するメッセージオブジェクトを削除します。 */ public void deleteMessageByPk(int pk) throws Exception { } }
これではCayenneに限らず、O/Rマッピングを使っている恩恵が無いような気もしますが・・・
でも、データ永続化の実装手段は何でも良くなった訳で・・・ヨシとさせて下さい(笑)。