Spring Roo 管理エンティティの統合テストでは、AspectJ mix-in スタイル インターフェイスを使用する際に問題が発生しました。このインターフェイスは、デフォルト実装のメソッドを導入するだけでなく、JSR 303 検証ルールで注釈が付けられた属性も追加します。問題は、Spring Roo の DataOnDemand ロジックがこれらのフィールドを認識しないため、getNewTransientObject() メソッドでそれらを考慮しないことです。
たとえば、次の (単純な) インターフェイスは、「キー」インターフェイスを実装するすべてのエンティティに「キー」フィールドを追加します。
import javax.persistence.Column;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public interface Keyed {
public String getKey();
public void setKey(String key);
/**
* AspectJ MixIn for any class which implements the interface. Provides a
* default implementation using AspectJ. This is the style shown in
* Manning's AspectJ in Action (2nd edition) for providing a default
* implementation interface.
*
* @author tgh
*/
static aspect Impl {
@NotNull
@Column(name = "key", unique = true)
@Size(min = 8, max = 12)
private String Keyed.key;
public void Keyed.setKey(String key) {
this.key = key;
}
public String Keyed.getKey() {
return this.key;
}
}
}
それは実際に私たちにとって解決された問題です。ここでは、Spring Roo で作成された AspectJ ITD (.aj) ファイルから getNewTransientObject() メソッドをプッシュインし、属性が許容値で設定されるようにしました。テスト クラスの DataOnDemand.java ファイルには、次のフラグメントがあります。
public KeyedExampleA getNewTransientKeyedExampleA(int index) {
KeyedExampleA obj = new KeyedExampleA();
setDescription(obj, index);
setListPrice(obj, index);
setName(obj, index);
// Deal with mix-in variables that Roo doesn't know about
obj.setKey("KEY_" + index);
return obj;
}
上記で不快なのは、DataOnDemand.java ファイルで setKey(obj, index) メソッドを作成しておらず、Spring Roo が getNewTransientKeyedObject(int) メソッド用に生成したものと同じスタイルを使用していないことです。
このような些細なケースのためにわざわざ setKey(obj,index) メソッドを作成する価値はありますか? それとも、getNewTransientObject() メソッド内で obj.setKey(value) を実行するという方法をそのまま使用する必要がありますか?
Spring Roo が作成した .aj ファイルを見ても、getNewTransientObject() メソッド以外に setField(obj,index) を呼び出すものがないため、大きな違いがあることがわかりません。また、Spring Roo は、混合導入された属性があることを認識していないため、おそらく今後も気にすることはありません。