在我们对 Spring Roo 托管实体的集成测试中,我们在使用 AspectJ 混合样式接口时遇到了问题,该接口不仅引入了具有默认实现的方法,而且还添加了一个使用 JSR 303 验证规则注释的属性。问题是 Spring Roo DataOnDemand 逻辑看不到这些字段,因此在 getNewTransientObject() 方法中没有考虑它们。
例如,以下(简单的)接口为每个实现“Keyed”接口的实体添加了一个“key”字段:
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 并没有弄清楚我们是否引入了 mix-in 属性,所以它将来也可能不会关心。