問題発覚!

前回の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マッピングを使っている恩恵が無いような気もしますが・・・
でも、データ永続化の実装手段は何でも良くなった訳で・・・ヨシとさせて下さい(笑)。