失敗
任意のクラス (この例では ABC) を継承したクラスに XDoclet のタグを記述し、XDoclet を実行します。 デプロイメント記述子、コールバック メソッドを実装した Bean クラス、各種インターフェースが、通常どおり自動生成されます。
ところが、自動生成されたコードでコンパイルエラーが発生しました。 エラーの原因となったローカル ホーム インターフェース/ローカル インターフェースを確認してみると、親インターフェースが ABCLocal/ABCLocalHome になっています。これは一体?
/**
* @ejb.bean
* name = "Sample"
* description = "Sample Entity Bean"
* display-name = "SampleEntity"
* type = "CMP"
* cmp-version = "2.x"
* jndi-name = "ejb/Sample"
* local-jndi-name = "ejb/SampleLocal"
* view-type = "local"
* reentrant = "false"
* primkey-field = "sampleId"
*
* 以下、省略
*/
public abstract class SampleBean extends ABC {}
public interface SampleLocalHome extends ABCLocalHome {}
public interface SampleLocal extends ABCLocal {}
環境
このレポートは、以下の環境について記述したものです。
| JDK | JDK 1.4 |
| EJB | EJB 2.0 |
| XDoclet | XDoclet 1.2.1 |
原因
XDoclet のタグを記述した Bean クラスが任意のクラスを継承している場合、生成されるホーム インターフェースやローカル インターフェースの親インターフェースは正しく認識されません。
解決策
@ejb.home および @ejb.interface タグを使用し、親インターフェースを明示します。
(1) 親インターフェースを明示する
ローカル ホーム インターフェースの場合は @ejb.home タグの local-extends 属性を、 ローカル インターフェースの場合は @ejb.interface タグの local-extends 属性に親インターフェースを指定します。
/**
* @ejb.bean
* name = "Sample"
* description = "Sample Entity Bean"
* display-name = "SampleEntity"
* type = "CMP"
* cmp-version = "2.x"
* jndi-name = "ejb/Sample"
* local-jndi-name = "ejb/SampleLocal"
* view-type = "local"
* reentrant = "false"
* primkey-field = "sampleId"
*
* @ejb.home
* local-extends = "javax.ejb.EJBLocalHome"
* local-class = "mypackage.SampleLocalHome"
* @ejb.interface
* local-extends = "javax.ejb.EJBLocalObject"
* local-class = "mypackage.SampleLocal"
*
* 以下、省略
*/
public abstract class SampleBean extends ABC {}
public interface SampleLocalHome extends javax.ejb.EJBLocalHome {}
public interface SampleLocal extends javax.ejb.EJBLocalObject {}
